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

66 lines
1.7 KiB
NASM

; ----------------------------------------------------------
; Arquivo : args.asm
; Descrição : Imprime argc e argv[0 .. (argc-1)]
; Montar com: nasm -f elf64 args.asm
; Ligar com : ls -o args args.o print_utils.o
; ----------------------------------------------------------
section .rodata
pref_argc db "argc : ", 0
pref_argv db "argv[", 0
posf_argv db "]: ", 0
; sub-rotinas do módulo print_utils.o
extern print_int
extern print_str
extern print_char
section .text
global _start
_start:
; ----------------------------------------------------------
; Impressão de argc
; ----------------------------------------------------------
mov rdi, pref_argc ; endereço de pref_argc
call print_str ; imprime pref_argc
mov rax, [rsp] ; rax = argc
call print_int ; imprime argc
mov rdi, 10 ; rdi = \n
call print_char ; imprime \n
; ----------------------------------------------------------
; Impressão de argv
; ----------------------------------------------------------
mov rcx, 0 ; índice i = 0
lea rbx, [rsp + 8] ; rbx = endereço de argv[0]
.print_argv_loop:
cmp rcx, [rsp] ; enquanto i < argc
jge .done_argv
mov rdi, pref_argv ; imprime prefixo "argv["
call print_str
mov rax, rcx ; rax = i
call print_int ; imprime índice
mov rdi, posf_argv ; imprime sufixo "]: "
call print_str
mov rdi, [rbx + rcx*8] ; rdi = argv[i]
call print_str
mov rdi, 10 ; imprime \n
call print_char
inc rcx
jmp .print_argv_loop
.done_argv:
; ----------------------------------------------------------
; Termina o programa com exit(0)
; ----------------------------------------------------------
mov rax, 60 ; syscall: exit
xor rdi, rdi ; status = 0
syscall