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