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