pbn/curso/aula-02.org
2025-05-14 12:45:11 -03:00

111 lines
2.4 KiB
Org Mode
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

* 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 <unistd.h>
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/