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