pbn/curso/exemplos/06/cargs.asm
2025-05-25 12:27:43 -03:00

50 lines
1.5 KiB
NASM

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