segment .data
table times 256 dq 0
struc node
n_value resq 1
n_next resq 1
align 8
endstruc
segment .text
global main, insert, print, find, hash
extern malloc, scanf, printf
; i = hash ( n );
hash mov rax, rcx
and rax, 0xff
ret
; insert ( n );
insert:
.n equ local1
.h equ local2
push rbp
mov rbp, rsp
frame 1, 2, 1
sub rsp, frame_size
mov [rbp+.n], rcx
call find
cmp rax, 0
jne .found
mov rcx, [rbp+.n]
call hash
mov [rbp+.h], rax
mov rcx, node_size
call malloc
mov r9, [rbp+.h]
mov r8, [table+r9*8]
mov [rax+n_next], r8
mov r8, [rbp+.n]
mov [rax+n_value], r8
mov [table+r9*8], rax
.found leave
ret
; p = find ( n );
; p = 0 if not found
find:
.n equ local1
push rbp
mov rbp, rsp
frame 1, 0, 1
sub rsp, frame_size
mov [rbp+.n], rcx
call hash
mov rax, [table+rax*8]
mov rcx, [rbp+.n]
cmp rax, 0
je .done
.more cmp rcx, [rax+n_value]
je .done
mov rax, [rax+n_next]
cmp rax, 0
jne .more
.done leave
ret
; print();
print:
push rbp
mov rbp, rsp
frame 0, 2, 2
sub rsp, frame_size
mov [rbp+local1], r12
mov [rbp+local2], r13
xor r12d, r12d
.more_table:
mov r13, [table+r12*8]
cmp r13, 0
je .empty
segment .data
.print1 db "list %3d: ",0
segment .text
lea rcx, [.print1]
mov rdx, r12
call printf
.more_list:
segment .data
.print2 db "%ld ",0
segment .text
lea rcx, [.print2]
mov rdx, [r13+n_value]
call printf
mov r13, [r13+n_next]
cmp r13, 0
jne .more_list
segment .data
.print3 db 0x0a,0
segment .text
lea rcx, [.print3]
call printf
.empty inc r12
cmp r12, 256
jl .more_table
mov r12, [rbp+local1]
mov r13, [rbp+local2]
pop r12
leave
ret
main:
.k equ local1
segment .data
.scanf_fmt:
db "%ld",0
segment .text
push rbp
mov rbp, rsp
frame 2, 1, 2
sub rsp, frame_size
.more lea rcx, [.scanf_fmt]
lea rdx, [rbp+.k]
call scanf
cmp rax, 1
jne .done
mov rcx, [rbp+.k]
call insert
call print
jmp .more
.done leave
ret