#+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 -- Conversão de strings numéricas para inteiros

[[./aula-08.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

* 9 -- Conversão de representações de ponto flutuante

[[./aula-09.org][Texto]] | [[#][Vídeo]]

- 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

[[./aula-13.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/)

* 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]]


