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

2.4 KiB
Raw Blame History

Aula 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

  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: 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

  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