#+title: 2. Linguagens de Montagem e a Compilação #+author: Blau Araujo #+email: cursos@blauaraujo.com #+options: toc:3 * 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/