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 local1
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 [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 ; subtract multiples of 16
mov [rbp+.rbx], rbx ; save old value of rbx
cmp rdi, 0
je .done
mov rbx, rdi
.more lea rdi, [.print_fmt]
mov rsi, [rbx+n_value]
xor eax, eax
call printf
mov rbx, [rbx+n_next]
cmp rbx, 0
jne .more
.done lea rdi, [.newline]
xor eax, eax
call printf
mov rbx, [rbp+.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 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 [rbp+.list], rax
mov rdi, rax
call print
jmp .more
.done leave
ret