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