From af6a245d76f90cacbc63226e529623a933a39f85 Mon Sep 17 00:00:00 2001 From: Blau Araujo Date: Wed, 14 May 2025 12:45:11 -0300 Subject: [PATCH] aula 2 --- curso/aula-02.org | 111 ++++++++++++++++++++++++++++++++++++ curso/exemplos/02/salve.asm | 17 ++++++ curso/exemplos/02/salve.c | 7 +++ 3 files changed, 135 insertions(+) create mode 100644 curso/aula-02.org create mode 100644 curso/exemplos/02/salve.asm create mode 100644 curso/exemplos/02/salve.c diff --git a/curso/aula-02.org b/curso/aula-02.org new file mode 100644 index 0000000..39e73b0 --- /dev/null +++ b/curso/aula-02.org @@ -0,0 +1,111 @@ +* Aula 2 – Linguagens de Montagem e a Compilação +:PROPERTIES: +:duration: 2h +:END: + +** Objetivos + +- Compreender o papel das linguagens de montagem. +- Distinguir montagem, compilação e linkagem. +- Conhecer o funcionamento do NASM e do `ld`. +- Utilizar ferramentas como `objdump` e `readelf`. + +** Resumo Teórico + +*** Do código-fonte ao binário + +1. *Código-fonte* (Assembly ou C) +2. *Montador* (NASM): converte =.asm= → =.o= (objeto) +3. *Linkado** (=ld=): converte =.o= → executável ELF +4. *Carregador* (/loader/ do sistema): executa binários ELF + +*** Linguagens de montagem + +- Traduzem o código diretamente para instruções de máquina. +- São específicas da arquitetura (ex: x86_64). +- NASM (Netwide Assembler): sintaxe no estilo Intel, direta e limpa. +- GAS (GNU Assembler): usada pelo GCC, sintaxe AT&T. + +*** Ferramentas úteis + +- =nasm=: montador +- =ld=: linkador (ou /link-editor/) +- =objdump -d=: desmonta o binário +- =readelf=: inspeciona cabeçalhos ELF +- =file=: mostra tipo do executável +- =xxd=: "despeja" conteúdo de binários em hexadecimal (instalado com o Vim) + +** Exemplo em Assembly NASM + +Arquivo: [[exemplos/02/salve.asm][salve.asm]] + +#+begin_src nasm :tangle exemplos/02/salve.asm +section .data + msg db "Salve, simpatia!", 10 + len equ $ - msg + +section .text + global _start + +_start: + mov rax, 1 ; syscall write + mov rdi, 1 ; stdout + mov rsi, msg + mov rdx, len + syscall + + mov rax, 60 ; syscall exit + xor rdi, rdi ; código de saída 0 + syscall +#+end_src + +*** Compilação e execução + +#+begin_example +:~$ nasm -f elf64 -o salve.o salve.asm +:~$ ld -o salve salve.o +:~$ ./salve +Salve, simpatia! +#+end_example + +*** Inspeção do executável + +#+begin_src sh +file salve +readelf -h salve +objdump -d salve +#+end_src + +** Versão equivalente em C + +Arquivo: [[exemplos/02/salve.c][salve.c]] + +#+begin_src C :tangle exemplos/02/salve.c +#include + +int main() { + const char *msg = "Salve, simpatia!\n"; + write(1, msg, 14); + return 0; +} +#+end_src + +*** Compilação e execução + +#+begin_example +:~$ gcc -o salvec salve.c +:~$ ./salvec +Salve, simpatia! +#+end_example + +** Exercícios sugeridos + +1. Modifique o programa para imprimir outra mensagem. +2. Use =objdump -d= para comparar os binários =salve= e =salvec=. +3. Compile o programa em C com =gcc -S -masm=intel= e estude o código-fonte em Assembly. + +** Referências + +- man 2 write +- man 1 nasm +- https://nasm.us/doc/ diff --git a/curso/exemplos/02/salve.asm b/curso/exemplos/02/salve.asm new file mode 100644 index 0000000..56740d1 --- /dev/null +++ b/curso/exemplos/02/salve.asm @@ -0,0 +1,17 @@ +section .data + msg db "Salve, simpatia!", 10 + len equ $ - msg + +section .text + global _start + +_start: + mov rax, 1 ; syscall write + mov rdi, 1 ; stdout + mov rsi, msg + mov rdx, len + syscall + + mov rax, 60 ; syscall exit + xor rdi, rdi ; código de saída 0 + syscall diff --git a/curso/exemplos/02/salve.c b/curso/exemplos/02/salve.c new file mode 100644 index 0000000..899e19d --- /dev/null +++ b/curso/exemplos/02/salve.c @@ -0,0 +1,7 @@ +#include + +int main() { + const char *msg = "Salve, simpatia!\n"; + write(1, msg, 14); + return 0; +}