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, 3 sub rsp, frame_size mov r8, rdx ; move argv to r8 mov rdx, [r8] ; get first argv string start_loop: lea rcx, [format] mov [rbp+local1], r8 ; save argv call printf mov r8, [rbp+local1] ; restore argv add r8, 8 ; advance to the next pointer in argv mov rdx, [r8] ; get next argv string cmp rdx, 0 ; it's sad that mov doesn't also test jnz start_loop ; end with NULL pointer end_loop: xor eax, eax leave ret