forked from blau_araujo/pbn
teste de cabeçalho
This commit is contained in:
parent
cc801fd713
commit
f45ffaae09
2 changed files with 110 additions and 221 deletions
110
curso/README.org
Normal file
110
curso/README.org
Normal file
|
@ -0,0 +1,110 @@
|
|||
#+title: Fundamentos da Programação em Baixo Nível
|
||||
#+author: Blau Araujo
|
||||
#+email: blau@debxp.org
|
||||
|
||||
#+options: toc:nil
|
||||
|
||||
* 0 -- Introdução à linguagem Assembly (NASM)
|
||||
|
||||
[[aula-00.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- O que é Assembly
|
||||
- Linguagem dependente da arquitetura
|
||||
- Linguagem de montagem
|
||||
- Classificações da linguagem
|
||||
- Comparação com outras linguagens
|
||||
- Por que aprender Assembly?
|
||||
- Principais sintaxes
|
||||
- O Netwide Assembler (NASM)
|
||||
- Instruções essenciais
|
||||
- Montagem e execução de programas em Assembly NASM
|
||||
|
||||
* 1 -- Arquitetura de computadores
|
||||
|
||||
[[aula-01.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- Modelo de von Neumann
|
||||
- Arquiteturas x86
|
||||
- Componentes de uma CPU x86_64
|
||||
- Principais registradores e seus propósitos (64 bits)
|
||||
- Primeiro exemplo em Assembly x86_64
|
||||
|
||||
* 2 -- Linguagens, montagem e compilação
|
||||
|
||||
[[aula-02.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- Do código-fonte ao binário
|
||||
- Programação em código de máquina
|
||||
- Linguagens de baixo e alto nível
|
||||
- Sistemas de tradução de linguagens
|
||||
- Um programa em Assembly
|
||||
- Uma versão equivalente em C
|
||||
- Desmontagem comparativa
|
||||
|
||||
* 3 -- O formato binário ELF
|
||||
|
||||
[[aula-03.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- O que é o formato ELF
|
||||
- Formato do arquivo
|
||||
- Seções especiais
|
||||
- Tipos de segmentos
|
||||
- Definindo seções ELF em NASM para Linux 64 bits
|
||||
|
||||
* 4 -- Mapeamento de memória
|
||||
|
||||
[[aula-04.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- Como programas são executados
|
||||
- Explorando os espaços de endereços de processos
|
||||
- Mapeamento de memória de um programa em C
|
||||
- Mapeamento de memória de um programa em Assembly
|
||||
|
||||
* 5 -- Pilha de hardware e pilha de memória
|
||||
|
||||
[[aula-05.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- Objetivos
|
||||
- O conceito de pilha (stack)
|
||||
- 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)
|
||||
- Convenções de chamadas de sistema
|
||||
|
||||
* 6 -- Vetor de argumentos de linha de comando
|
||||
|
||||
[[aula-06.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- O quadro inicial da pilha do processo
|
||||
- Inspecionando argumentos e variáveis exportadas
|
||||
- Acesso aos argumentos em baixo nível
|
||||
- Listando todos os dados de argumentos
|
||||
|
||||
* 7 -- Vetor de ambiente
|
||||
|
||||
[[aula-07.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- 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
|
||||
|
||||
[[aula-08.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- Tabela de descritores de arquivos
|
||||
- Uso dos fluxos de dados padrão no shell
|
||||
- Uso dos fluxos de dados padrão em programas
|
||||
- Criação e manipulação de fluxos de dados
|
||||
- Armazenamento temporário (/bufferização/)
|
||||
|
||||
* 9 -- Conversão de strings numéricas para inteiros
|
||||
|
||||
[[aula-09.org][Texto]] | [[#][Vídeo]]
|
||||
|
||||
- Todos os dados externos são recebidos como caracteres
|
||||
- Conversão para inteiros sem sinal em alto nível
|
||||
- Conversão para inteiros sem sinal em baixo nível
|
||||
- Conversão para inteiros com sinal
|
|
@ -1,221 +0,0 @@
|
|||
#+title: Fundamentos da Programação em Baixo Nível
|
||||
#+author: Blau Araujo
|
||||
#+email: blau@debxp.org
|
||||
|
||||
#+options: toc:nil
|
||||
|
||||
* 0 -- Introdução à linguagem Assembly (NASM)
|
||||
|
||||
[[aula-00.org][Texto]] | [[][vídeo]]
|
||||
|
||||
- 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
|
Loading…
Add table
Reference in a new issue