2.4 KiB
2.4 KiB
2. Linguagens de Montagem e a Compilação
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
- Código-fonte (Assembly ou C)
- Montador (NASM): converte
.asm
→.o
(objeto) - Linkado* (
ld
): converte.o
→ executável ELF - 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
: montadorld
: linkador (ou link-editor)objdump -d
: desmonta o binárioreadelf
: inspeciona cabeçalhos ELFfile
: mostra tipo do executávelxxd
: "despeja" conteúdo de binários em hexadecimal (instalado com o Vim)
Exemplo em Assembly NASM
Arquivo: 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
Compilação e execução
:~$ nasm -f elf64 -o salve.o salve.asm :~$ ld -o salve salve.o :~$ ./salve Salve, simpatia!
Inspeção do executável
file salve
readelf -h salve
objdump -d salve
Versão equivalente em C
Arquivo: salve.c
#include <unistd.h>
int main() {
const char *msg = "Salve, simpatia!\n";
write(1, msg, 14);
return 0;
}
Compilação e execução
:~$ gcc -o salvec salve.c :~$ ./salvec Salve, simpatia!
Exercícios sugeridos
- Modifique o programa para imprimir outra mensagem.
- Use
objdump -d
para comparar os bináriossalve
esalvec
. - 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/