* 0 -- Introdução à linguagem Assembly (NASM)

- O que é Assembly
- Linguagem dependente da arquitetura
- Linguagem de montagem
- Classificações da linguagem
  -  De baixo nível de abstração (segunda geração)
  -  Imperativa
  -  De tipagem inexistente
  -  Com gerenciamento manual de memória
  -  Compilada via montagem
  -  Paradigmas
  -  De uso específico
- Comparação com outras linguagens
  -  Não há estruturas de controle
  -  Não há o conceito de variáveis
  -  Ponteiros, só por analogia
  -  Em vez de tipos, quantidades de bytes
- Por que aprender Assembly?
  -  Entendimento do funcionamento de computadores
  -  Depuração e análise
  -  Integração com C
  -  Aprendizado
- Principais sintaxes
  -  Sintaxe AT&T
  -  Sintaxe Intel
  -  Compatibilidade
- O Netwide Assembler (NASM)
  - Sintaxe de instruções
  - Sintaxe de metaprogramação da montagem
  - Operadores e símbolos
  - Seções no NASM
  - Importação e exportação de símbolos
  - Tipos de operandos em instruções
- Instruções essenciais
  - Instrução =mov=
  - Instrução =lea=
  - Instruções aritméticas básicas (=inc=, =dec=, =add= e =sub=)
  - Instruções de multiplicação e divisão (=mul=, =imul=, =div= e =idiv=)
  - Instrução =jmp= (salto incondicional)
  - Instruções de salto condicional
  - Instrução =cmp=
  - Instrução =test=
  - Instruções =call= e =ret=
  - Instrução =syscall=
  - Padrões frequentemente utilizados
- Montagem e execução de programas em Assembly NASM
  - Requisitos
  - Exemplo: "Salve, simpatia!"

* 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
    
* 6 -- Vetor de argumentos de linha de comando

- O quadro inicial da pilha do processo
- Inspecionando argumentos e variáveis exportadas
  - Contador de argumentos
  - Primeiro elemento do vetor de argumentos
  - Separador nulo do vetor de argumentos
  - Primeiro elemento do vetor ambiente
  - Resultados com mais de um argumento
- Acesso aos argumentos em baixo nível
  - Acesso direto à pilha
  - Acesso em Assembly exportando main
- Listando todos os dados de argumentos
  - Exemplo em Assembly com main e gcc
  - Exemplo com acesso direto à pilha

* 7 -- Vetor de ambiente

- Revisão: o quadro inicial da pilha do processo
- Localizando o vetor de ambiente
- Extraindo valores de variáveis exportadas
- Implementação com funções da linguagem C

* 8 -- Fluxos de dados

- Tabela de descritores de arquivos
  - Uma nota sobre tipos de arquivos
  - Descritores de arquivos padrão
  - Abstração em alto nível (/stream/)
- Uso dos fluxos de dados padrão no shell
  - Mecanismo de redirecionamento
  - Mecanismo de pipe
  - Captura da entrada padrão
- Uso dos fluxos de dados padrão em programas
  - Demonstrando um redirecionamento interno
  - Demonstrando um pipe interno
  - Demonstrando a leitura da entrada padrão
  - Identificando a origem do fluxo de leitura
- Criação e manipulação de fluxos de dados
- Armazenamento temporário (/bufferização/)
  - Bufferização em alto nível
  - Bufferização no nível do kernel
  - Bufferização em Assembly

* 9 -- Conversão de strings numéricas para inteiros

- Todos os dados externos são recebidos como caracteres
  - Entendendo o problema
  - A ordem dos bytes
  - Dígitos na tabela ASCII
  - Considerações sobre os tipos numéricos
  - Pesos posicionais
- Conversão para inteiros sem sinal em alto nível
  - Erro de ponteiro nulo
  - Erro de byte inicial fora faixa de dígitos
  - Erro de estouro do limite do tipo
  - Implementação final em C
  - Exemplo de uso
- Conversão para inteiros sem sinal em baixo nível
  - Erro de ponteiro nulo
  - Erro de byte inicial fora da faixa de dígitos
  - Erro de estouro do limite do tipo
  - Implementação final em Assembly
  - Teste com o GDB
- Conversão para inteiros com sinal
  - Interpretação do sinal
  - Uma nota sobre as flags
  - Limites de inteiros com sinal
  - Procedimento de conversão para inteiros com sinal
  - Conversão em alto nível
  - Conversão em baixo nível
