forked from blau_araujo/pbn
exemplos da aula 6
This commit is contained in:
parent
ee62511898
commit
4d701d4461
5 changed files with 304 additions and 0 deletions
50
curso/exemplos/06/cargs.asm
Normal file
50
curso/exemplos/06/cargs.asm
Normal file
|
@ -0,0 +1,50 @@
|
|||
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
|
Loading…
Add table
Add a link
Reference in a new issue