50 lines
1.5 KiB
NASM
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
|