112 lines
2.4 KiB
Org Mode
112 lines
2.4 KiB
Org Mode
|
* 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/
|