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, rdi
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], rdi
call find
cmp rax, 0
jne .found
mov rdi, [rbp+.n]
call hash
mov [rbp+.h], rax
mov rdi, node_size
call malloc
mov r9, [rbp+.h]
lea rsi, [table]
mov r8, [rsi+r9*8]
mov [rax+n_next], r8
mov r8, [rbp+.n]
mov [rax+n_value], r8
mov [rsi+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, 1, 1
sub rsp, frame_size
mov [rbp+.n], rdi
call hash
lea rsi, [table]
mov rax, [rsi+rax*8]
mov rdi, [rbp+.n]
cmp rax, 0
je .done
.more cmp rdi, [rax+n_value]
je .done
mov rax, [rax+n_next]
cmp rax, 0
jne .more
.done leave
ret
; print();
print:
.r12 equ local1
.r13 equ local2
push rbp
mov rbp, rsp
frame 0, 2, 2
; preserve r12 and r13 which will survive function calls
sub rsp, frame_size
mov [rbp+.r12], r12 ; r12 is i: integer counter for table
mov [rbp+.r13], r13 ; r13 is p: pointer for list at table[i]
xor r12, r12
.more_table:
lea rsi, [table]
mov r13, [rsi+r12*8]
cmp r13, 0
je .empty
segment .data
.print1 db "list %3d: ",0
segment .text
lea rdi, [.print1]
mov rsi, r12
xor eax, eax
call printf
.more_list:
segment .data
.print2 db "%ld ",0
segment .text
lea rdi, [.print2]
mov rsi, [r13+n_value]
xor eax, eax
call printf
mov r13, [r13+n_next]
cmp r13, 0
jne .more_list
segment .data
.print3 db 0x0a,0
segment .text
lea rdi, [.print3]
xor eax, eax
call printf
.empty inc r12
cmp r12, 256
jl .more_table
mov r12, [rbp+.r12]
mov r13, [rbp+.r13]
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 rdi, [.scanf_fmt]
lea rsi, [rbp+.k]
xor eax, eax
call scanf
cmp rax, 1
jne .done
mov rdi, [rbp+.k]
call insert
call print
jmp .more
.done leave
ret