section .bss argc: resq 1 ; 8 bytes para armazenar argc argv: resq 1 ; 8 bytes para armazenar ponteiro para argv[0] section .data fmt_argc db "argc : %ld", 10, 0 fmt_argv db "argv[%d]: %s", 10, 0 global main extern printf section .text main: ; rdi = argc ; rsi = argv mov [argc], rdi ; salvar argc mov [argv], rsi ; salvar argv[0] ; Imprimir com: printf("argc : %ld", argc); mov rdi, fmt_argc ; primeiro argumento: formato mov rsi, [argc] ; segundo argumento: argc (qword = long) xor rax, rax ; terminação de argumentos call printf ; preparar o laço: i = 0 xor rcx, rcx ; i = 0 mov rbx, [argv] ; rbx = argv base mov r8, [argc] ; r8 = argc .loop: cmp rcx, r8 ; compara i com argc jge .done ; se i >= argc, fim ; Imprimir com: printf("argv[%d]: %s\n", i, argv[i]); mov rdi, fmt_argv ; primeiro argumento: formato mov rsi, rcx ; segundo argumento: i mov rdx, [rbx + rcx*8] ; terceiro argumento: argv[i] xor rax, rax ; terminação de argumentos push rcx ; salvar rcx (caller saved) na pilha push r8 ; salvar r8 (caller saved) na pilha call printf pop r8 ; restaurar rcx pop rcx ; restaurar rcx inc rcx jmp .loop .done: xor eax, eax ; retorno de main: (int)0 ret