66 lines
1.7 KiB
NASM
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
|