segment .data struc node n_value resq 1 n_next resq 1 align 8 endstruc segment .text global main, newlist, insert, print extern malloc, printf, scanf ; list = newlist(); newlist: xor eax, eax ret ; list = insert ( list, k ); insert: .list equ local1 .k equ local2 push rbp mov rbp, rsp frame 2, 2, 1 sub rsp, frame_size mov [rbp+.list], rcx ; save list pointer mov [rbp+.k], rdx ; and k on stack mov ecx, node_size call malloc ; rax will be node pointer mov r8, [rbp+.list] ; get list pointer mov [rax+n_next], r8 ; save pointer in node mov r9, [rbp+.k] ; get k mov [rax+n_value], r9 ; save k in node leave ret ; print ( list ); print: segment .data .print_fmt: db "%ld ",0 .newline: db 0x0a,0 segment .text .rbx equ local1 push rbp mov rbp, rsp frame 1, 1, 2 sub rsp, frame_size ; shadow space mov [rbp+.rbx], rbx ; save old value of rbx cmp rcx, 0 je .done mov rbx, rcx .more lea rcx, [.print_fmt] mov rdx, [rbx+n_value] call printf mov rbx, [rbx+n_next] cmp rbx, 0 jne .more .done lea rcx, [.newline] call printf mov rbx, [rsp+.rbx] ; restore rbx leave ret main: .list equ local1 .k equ local2 segment .data .scanf_fmt: db "%ld",0 segment .text push rbp mov rbp, rsp frame 2, 2, 2 sub rsp, frame_size call newlist mov [rbp+.list], rax .more lea rcx, [.scanf_fmt] lea rdx, [rbp+.k] call scanf cmp rax, 1 jne .done mov rcx, [rbp+.list] mov rdx, [rbp+.k] call insert mov [rbp+.list], rax mov rcx, rax call print jmp .more .done leave ret