segment .data
format db "%s",0x0a,0
segment .text
global main ; let the linker know about main
extern printf ; resolve printf from libc
main:
push rbp ; prepare stack frame for main
mov rbp, rsp
frame 2, 1, 2
sub rsp, frame_size
mov rcx, rsi ; move argv to rcx
mov rsi, [rcx] ; get first argv string
start_loop:
lea rdi, [format]
mov [rbp+local1], rcx ; save argv
xor eax, eax
call printf
mov rcx, [rbp+local1] ; restore rsi
add rcx, 8 ; advance to the next pointer in argv
mov rsi, [rcx] ; get next argv string
cmp rsi, 0 ; it's sad that mov doesn't also test
jnz start_loop ; end with NULL pointer
end_loop:
xor eax, eax
leave
ret