2025-06-08 10:35:24 -03:00
|
|
|
#+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)
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-00.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-01.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-02.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-03.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-04.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-05.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-06.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-07.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
- 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
|
|
|
|
|
2025-06-18 09:40:30 -03:00
|
|
|
* 8 -- Conversão de strings numéricas para inteiros
|
2025-06-08 10:35:24 -03:00
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-08.org][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
2025-06-18 09:40:30 -03:00
|
|
|
- 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
|
|
|
|
|
|
|
|
* 9 -- Conversão de representações de ponto flutuante
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-09.org][Texto]] | [[#][Vídeo]]
|
2025-06-18 09:40:30 -03:00
|
|
|
|
|
|
|
- Tipos de ponto flutuante em C
|
|
|
|
- Representações em expressões constantes
|
|
|
|
- Codificação binária do tipo double (64 bits)
|
|
|
|
- Codificação binária do tipo float (32 bits)
|
|
|
|
- Unidades de ponto flutuante em x86_64
|
|
|
|
- Conversão de strings para float
|
|
|
|
|
|
|
|
* 10 -- Conversão de números para caracteres
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
|
|
|
|
|
|
|
* 11 -- Conversão de bases de numeração
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
|
|
|
|
|
|
|
* 12 -- Bibliotecas, macros e sub-rotinas
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
|
|
|
|
|
|
|
* 13 -- Fluxos de dados
|
|
|
|
|
2025-06-18 09:45:25 -03:00
|
|
|
[[./aula-13.org][Texto]] | [[#][Vídeo]]
|
2025-06-18 09:40:30 -03:00
|
|
|
|
2025-06-08 10:35:24 -03:00
|
|
|
- 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/)
|
|
|
|
|
2025-06-18 09:40:30 -03:00
|
|
|
* 14 -- Criação e manipulação de arquivos
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
|
|
|
|
|
|
|
* 15 -- Implementação de funções para uso em C
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
|
|
|
|
|
|
|
* 16 -- Utilizando funções da GLibc
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
|
|
|
|
|
|
|
* 17 -- Desafio de encerramento
|
|
|
|
|
|
|
|
[[#][Texto]] | [[#][Vídeo]]
|
2025-06-08 10:35:24 -03:00
|
|
|
|
|
|
|
|