* 1 -- Arquitetura de computadores

- Modelo de von Neumann
  - Influência nas arquiteturas modernas
  - Gargalo de Von Neumann
- Arquiteturas x86
  - Características
  - Gerações da família x86:
  - Comparativo com outras arquiteturas
- Componentes de uma CPU x86_64
- Principais registradores e seus propósitos (64 bits)
  - Relação com outras arquiteturas x86
- Primeiro exemplo em Assembly x86_64
  - Seção do código executável
  - O ponto de entrada
  - Chamada de sistema
  - Montagem e execução (no terminal)

* 2 -- Linguagens, montagem e compilação

- Do código-fonte ao binário
  - Arquivos texto e binários
  - Formato de binário executável
- Programação em código de máquina
- Linguagens de baixo e alto nível
- Sistemas de tradução de linguagens
  - Linguagens interpretadas
  - Linguagens compiladas
  - Linguagens de montagem
- Um programa em Assembly
  - Tamanho do binário em bytes
  - Informações gerais do arquivo
  - Cabeçalho do formato ELF
  - Lista de seções do programa
  - Despejo do conteúdo (em hexa) da seção .text
  - Despejo do conteúdo (em hexa) da seção .rodata
- Uma versão equivalente em C
  - Tamanho do binário em bytes:
  - Informações gerais do arquivo
  - Cabeçalho do formato ELF
  - Lista de seções do programa
  - Despejo do conteúdo (em hexa) da seção .text
  - Despejo do conteúdo (em hexa) da seção .rodata
- Desmontagem comparativa

* 3 -- O formato binário ELF

- O que é o formato ELF
  - Principais tipos de arquivos objeto
- Formato do arquivo
- Seções especiais
- Tipos de segmentos
- Definindo seções ELF em NASM para Linux 64 bits
  - Uma nota sobre alinhamento de dados
  -  Inspecionando a seção .rodata
  - Inspeção da seção .data
  - Inspecionando a seção .bss

* 4 -- Mapeamento de memória

- Como programas são executados
  - O que são processos
  - Layout da memória virtual de um processo
- Explorando os espaços de endereços de processos
- Mapeamento de memória de um programa em C
  - Análise com 'pmap'
  - Análise com o arquivo /proc/<pid>/maps
- Mapeamento de memória de um programa em Assembly
  - Análise com o GNU Debugger (GDB)
  - Executáveis independentes de posição (PIE)

* 5 -- Pilha de hardware e pilha de memória

- Objetivos
- O conceito de pilha (stack)
  - Implementação da pilha como estrutura de dados
  - Aplicações típicas
  - Operações associadas às pilhas
- Pilha de memória
- Pilha de hardware
- Registradores e a pilha de memória
- Convenções de chamadas de funções (System V AMD64 ABI)
  - Ordem dos argumentos
  - Valor de retorno
  - Registradores preservados e não preservados
  - Exemplo em C
  - Quadro de pilha (/stack frame/)
- Convenções de chamadas de sistema
  - Exemplo em Assembly
  - Preservação de registradores com a pilha
  - Resumo comparativo com chamadas de funções
