; ----------------------------------------------------------
; 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
