            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