forked from blau_araujo/pbn
exemplos da aula 7
This commit is contained in:
parent
05ef406060
commit
c142033bf7
3 changed files with 234 additions and 0 deletions
89
curso/exemplos/07/cgetenv.asm
Normal file
89
curso/exemplos/07/cgetenv.asm
Normal file
|
@ -0,0 +1,89 @@
|
|||
; ----------------------------------------------------------
|
||||
; Montagem: nasm -f elf64 cgetenv.asm
|
||||
; Ligação : gcc -no-pie -o cgetenv cgetenv.o
|
||||
; Uso : ./cgetenv PATH
|
||||
; ----------------------------------------------------------
|
||||
; Funções importadas da glibc...
|
||||
; ----------------------------------------------------------
|
||||
extern getenv
|
||||
extern puts
|
||||
extern fprintf
|
||||
extern exit
|
||||
extern stderr
|
||||
; ----------------------------------------------------------
|
||||
section .rodata
|
||||
; ----------------------------------------------------------
|
||||
msg_nf db "Not found", 10, 0
|
||||
msg_usage db "Usage: ./getenv VAR", 10, 0
|
||||
; ----------------------------------------------------------
|
||||
section .bss
|
||||
; ----------------------------------------------------------
|
||||
argc resq 1 ; recebe quantidade de argumentos
|
||||
argv resq 1 ; recebe endereço de argv[0]
|
||||
envp resq 1 ; recebe endereço de envp[0]
|
||||
; ----------------------------------------------------------
|
||||
section .text
|
||||
; ----------------------------------------------------------
|
||||
global main
|
||||
main:
|
||||
; ----------------------------------------------------------
|
||||
; Iniciar quadro de pilha para main...
|
||||
; ----------------------------------------------------------
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
; ----------------------------------------------------------
|
||||
; Salvar dados de argumentos e ambiente...
|
||||
; ----------------------------------------------------------
|
||||
mov [argc], rdi ; salvar valor de argc
|
||||
mov [argv], rsi ; salvar endereço de argv[0]
|
||||
mov [envp], rdx ; salvar endereço de envp[0]
|
||||
; ----------------------------------------------------------
|
||||
; Verificar se argc < 2
|
||||
; ----------------------------------------------------------
|
||||
cmp rdi, 2
|
||||
jl show_usage
|
||||
; ----------------------------------------------------------
|
||||
; getenv(argv[1]);
|
||||
; ----------------------------------------------------------
|
||||
mov rax, [argv] ; endereço de argv[0]
|
||||
mov rdi, [rax + 8] ; argumento 1: endereço de argv[1]
|
||||
call getenv ; chamar getenv
|
||||
test rax, rax ; testar retorno (0 = não encontrada)
|
||||
jz not_found
|
||||
; ----------------------------------------------------------
|
||||
; Imprimir valor encontrado: puts(char *valor)
|
||||
; ----------------------------------------------------------
|
||||
mov rdi, rax ; argumento 1: endereço do valor em rax
|
||||
call puts ; chamar puts
|
||||
; ----------------------------------------------------------
|
||||
; Término com sucesso: exit(int status);
|
||||
; ----------------------------------------------------------
|
||||
mov edi, 0 ; argumento 1: (int)0 - sucesso
|
||||
call exit ; chamar exit
|
||||
; ----------------------------------------------------------
|
||||
; Se o nome da variável não for encontrado...
|
||||
; ----------------------------------------------------------
|
||||
not_found:
|
||||
; ----------------------------------------------------------
|
||||
; Mensagem de erro: fprintf(stderr, "Not found\n");
|
||||
; ----------------------------------------------------------
|
||||
mov rdi, [stderr] ; argumento 1: stream de saída
|
||||
lea rsi, [msg_nf] ; argumento 2: string de formato
|
||||
call fprintf ; chamar fprintf
|
||||
jmp exit_error ; termina com erro
|
||||
; ----------------------------------------------------------
|
||||
; Quantidade de argumentos incorrerta...
|
||||
; ----------------------------------------------------------
|
||||
show_usage:
|
||||
; ----------------------------------------------------------
|
||||
; Mensagem de erro: fprintf(stderr, "Usage: ./getenv VAR\n");
|
||||
; ----------------------------------------------------------
|
||||
mov rdi, [stderr] ; argumento 1: stream de saída
|
||||
lea rsi, [msg_usage] ; argumento 2: string de formato
|
||||
call fprintf ; chamar fprintf
|
||||
; ----------------------------------------------------------
|
||||
; Término com erro
|
||||
; ----------------------------------------------------------
|
||||
exit_error:
|
||||
mov edi, 1 ; argumento 1: (int)1 - erro
|
||||
call exit ; chamar exit
|
Loading…
Add table
Add a link
Reference in a new issue