From f45ffaae09de8df63514581a58790c00866feb76 Mon Sep 17 00:00:00 2001 From: Blau Araujo Date: Sun, 8 Jun 2025 10:35:24 -0300 Subject: [PATCH] =?UTF-8?q?teste=20de=20cabe=C3=A7alho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- curso/README.org | 110 ++++++++++++++++++++++ curso/contents.org | 221 --------------------------------------------- 2 files changed, 110 insertions(+), 221 deletions(-) create mode 100644 curso/README.org delete mode 100644 curso/contents.org diff --git a/curso/README.org b/curso/README.org new file mode 100644 index 0000000..6fbcf5e --- /dev/null +++ b/curso/README.org @@ -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 diff --git a/curso/contents.org b/curso/contents.org deleted file mode 100644 index 4730a91..0000000 --- a/curso/contents.org +++ /dev/null @@ -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//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