segment .data struc node n_value resq 1 n_next resq 1 n_prev resq 1 align 8 endstruc segment .text global main, newlist, insert, print extern malloc, printf, scanf ; list = newlist(); newlist: push rbp mov rbp, rsp mov edi, node_size call malloc mov [rax+n_next], rax mov [rax+n_prev], rax leave ret ; 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], rdi ; save list pointer mov [rbp+.k], rsi ; and k on stack mov edi, node_size call malloc ; rax will be node pointer mov r8, [rbp+.list] ; get list pointer mov r9, [r8+n_next] ; get head's next mov [rax+n_next], r9 ; set new node's next mov [rax+n_prev], r8 ; set new node's prev mov [r8+n_next], rax ; set head's next mov [r9+n_prev], rax ; set new node's next's prev 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 .list equ local1 .rbx equ local2 push rbp mov rbp, rsp frame 1, 1, 2 sub rsp, frame_size mov [rbp+.rbx], rbx mov [rbp+.list], rdi mov rbx, [rdi+n_next] cmp rbx, [rbp+.list] je .done .more lea rdi, [.print_fmt] mov rsi, [rbx+n_value] xor eax, eax call printf mov rbx, [rbx+n_next] cmp rbx, [rbp+.list] jne .more .done lea rdi, [.newline] xor eax, eax call printf mov rbx, [rbp+.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 rdi, [.scanf_fmt] lea rsi, [rbp+.k] xor eax, eax call scanf cmp rax, 1 jne .done mov rdi, [rbp+.list] mov rsi, [rbp+.k] call insert mov rdi, [rbp+.list] call print jmp .more .done leave ret