pbn/curso/aula-02.org

111 lines
2.4 KiB
Org Mode
Raw Normal View History

2025-05-14 12:52:20 -03:00
#+title: 2 -- Linguagens de Montagem e a Compilação
2025-05-14 12:50:43 -03:00
#+author: Blau Araujo
#+email: cursos@blauaraujo.com
2025-05-14 12:45:11 -03:00
2025-05-14 12:50:43 -03:00
#+options: toc:3
* Objetivos
2025-05-14 12:45:11 -03:00
- 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`.
2025-05-14 12:59:09 -03:00
* Do código-fonte ao binário
2025-05-14 12:45:11 -03:00
2025-05-14 12:59:09 -03:00
1. *Código-fonte* (Assembly)
2025-05-14 12:45:11 -03:00
2. *Montador* (NASM): converte =.asm==.o= (objeto)
3. *Linkado** (=ld=): converte =.o= → executável ELF
4. *Carregador* (/loader/ do sistema): executa binários ELF
2025-05-14 12:50:43 -03:00
** Linguagens de montagem
2025-05-14 12:45:11 -03:00
- 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.
2025-05-14 12:50:43 -03:00
** Ferramentas úteis
2025-05-14 12:45:11 -03:00
- =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)
2025-05-14 12:50:43 -03:00
* Exemplo em Assembly NASM
2025-05-14 12:45:11 -03:00
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
2025-05-14 12:50:43 -03:00
** Compilação e execução
2025-05-14 12:45:11 -03:00
#+begin_example
:~$ nasm -f elf64 -o salve.o salve.asm
:~$ ld -o salve salve.o
:~$ ./salve
Salve, simpatia!
#+end_example
2025-05-14 12:50:43 -03:00
** Inspeção do executável
2025-05-14 12:45:11 -03:00
#+begin_src sh
file salve
readelf -h salve
objdump -d salve
#+end_src
2025-05-14 12:50:43 -03:00
* Versão equivalente em C
2025-05-14 12:45:11 -03:00
Arquivo: [[exemplos/02/salve.c][salve.c]]
#+begin_src C :tangle exemplos/02/salve.c
#include <unistd.h>
int main() {
const char *msg = "Salve, simpatia!\n";
write(1, msg, 14);
return 0;
}
#+end_src
2025-05-14 12:50:43 -03:00
** Compilação e execução
2025-05-14 12:45:11 -03:00
#+begin_example
:~$ gcc -o salvec salve.c
:~$ ./salvec
Salve, simpatia!
#+end_example
2025-05-14 12:50:43 -03:00
* Exercícios sugeridos
2025-05-14 12:45:11 -03:00
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.
2025-05-14 12:50:43 -03:00
* Referências
2025-05-14 12:45:11 -03:00
- man 2 write
- man 1 nasm
- https://nasm.us/doc/