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