#+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]]