Introdução Software Básico Aula 3 Prof. Dr. Rogério Vargas http://rogerio.in
Provocação Você já se perguntou como é que os programas que você escreve são traduzidos em instruções executáveis pelas estruturas elementares em uma Arquitetura de Von Neumann?
Objetivo da disciplina Entender como funciona um computador Nível de Linguagem de Montagem e de Máquina Ideia Geral Compreender a interação entre componentes de hw e sw Entender a hierarquia de abstrações implementada por esses sistemas
Hierarquia de Abstrações
Assembly (não é Assembler ) Uso de mnemônicos Cada linha do código fonte possui apenas uma instrução para o processador (CPU) ex.: mov %eax, %edx
Assembly X Assembler Sufixo ER em inglês Programa assembly: usa o sistema operacional (por exemplo para E/S) Um montador ou assembler traduz: assembly linguagem de máquina Nós queremos: lidar com aspectos da programação assembly e linguagem de máquina. Hardware: nos interessa na medida em que influencia essa programação
Geração de um Executável É necessário traduzir o programa para linguagem de máquina Isto é feito em 4 etapas
Geração de um Executável É necessário traduzir o programa para linguagem de máquina Isto é feito em 4 etapas A propósito: eu usarei o compilador GCC do Linux!
1. Pré-Processamento Muda o programa conforme diretivas (#) #include <stdio.h> Incluir o arquivo sdio.h Gera um programa expandido (normalmente com extensão.i)
2. Compilação Traduz o programa.i em assembly Formato típico de saída da maioria dos compiladores Compiladores é uma disciplina regular dos cursos de Ciência da Computação
3. Montagem Transforma o código em assembly para linguagem de máquina Programa objeto Armazenado como um arquivo binário Extensão:.o
4. Ligação O ligador (linker) gera o programa executável a partir do.o gerado pelo assembler. Porém, pode haver funções padrão da linguagem (por ex., printf) que não estão definidas no programa, mas em outro arquivo.o précompilado (no caso, printf.o). O ligador faz a junção dos programas objetos necessários para gerar o executável.
Pra que estudar isso? Programando em linguagem de alto nível (C, C++, etc.) o programador não se preocupa com o gerenciamento de memória, e compilador ajuda a detectar vários erros relacionados a sintaxe e tipos de dados. Porém, é importante conhecer linguagem assembly e o que está por baixo do programa para: 1. Otimizar desempenho de programas Um switch é sempre mais eficiente que uma cadeia de if-else? Por que loops funcionalmente equivalentes podem ter desempenhos significativamente diferentes na execução?
Pra que estudar isso? 2. Entender erros de ligação Costumam ser os erros mais chatos em programação: referências não resolvidas, etc. 3. Se tornar mais preparado para evitar bugs, por exemplo, devido às limitações das representações dos tipos e na manipulação da memória Representações finitas de tipos: int s não são inteiros e float s não são reais e máquina arredonda ou trunca números. x 2 > 0 int: 50000 * 50000 =??? (x + y) + z = x + (y + z) float: 1e20 + (-1e20 + 3.14) =?? Memória não é confinada (bounded) em C. Exemplo de possível erro: main main () () { { long long int int a[2]; a[2]; double double d d = = 3.14; 3.14; a[2] a[2] = = 1073741824; 1073741824; /* /* Referência Referência out out of of bounds bounds */ */ printf("d printf("d = = %.15g\n", %.15g\n", d); d); exit(0); exit(0); } }
Pra que estudar isso? 4. Ser capaz de fazer engenharia reversa entender como um compilador gera código, ou como (uma parte) de um executável funciona 5. Obter uma primeira noção de como programar sistemas embarcados processadores específicos controle de máquinas- para os quais não existe ainda linguagem de alto nível
Onde a gente vai se debruçar
Onde a gente vai se debruçar Representação de dados, mecanismos de controle, funções, pilha, variáveis locais
Onde a gente vai se debruçar Representação de dados, mecanismos de controle, funções, pilha, variáveis locais Linguagem de montagem
Onde a gente vai se debruçar Representação de dados, mecanismos de controle, funções, pilha, variáveis locais Linguagem de montagem Interrupções Interação com SO
Onde a gente vai se debruçar Representação de dados, mecanismos de controle, funções, pilha, variáveis locais Linguagem de montagem Interrupções Interação com SO Ligação
Executando um programa >./hello >hello, word > O programa binário (executável) possui instruções em código de máquina O shell do SO lê o conteúdo para a memória e dispara (run) a execução Isso depende do HW
Um programa na Anatomia da Máquina
CPU (Central Processing Unit) Unidade de Controle Unidade Aritmética e Lógica (ALU) Conjunto de registradores Memória muito rápida contidos na CPU Instruções transferem dados entre memória e registradores Operandos ficam em registradores Exemplos de registradores PC (program counter): endereço da próxima instrução IR (Instruction register): instrução a ser executada Registradores de propósito geral
Fetch-Decode-Execute (busca-decodifica-executa) Algoritmo básico da CPU Busca instrução (copia em IR) Atualiza PC (para a próxima instrução) Decodifica instrução Busca microprograma e operandos na memória Executa instrução Aritméticas e lógicas / transferência de dados / desvio de fluxo Escreve na memória Seta flags de status
Esquema de instruções da CPU load copia um dado da memória para um registrador store copia um dado de um registrador para a memória operate copia dados de registradores para a ULA e executa uma operação jump extrai um endereço de uma instrução e escreve no PC
Memória Armazena dados e instruções de um programa Uma espécie de array sendo que Instruções ocupam um espaço variável Espaço dos dados depende do tipo Os registradores podem armazenar endereços O tamanho dos registradores limita o número de endereços acessáveis Registradores de 32 bits: 2 32 = 4.294.967.296 Registradores de 64 bits: 2 64 = 18.446.744.073.709.551.616
Memória Virtual Cada processo possui uma memória próxima Mapeada em um espaço na memória real Pode extrapolar a memória RAM e usar parte do disco Responsabilidade do SO
Um programa na Anatomia da Máquina Hello, word \n Código de hello
Um programa na Anatomia da Máquina Hello, word \n Código de hello Hello word
O que queremos aprender? Armazenamento e representação dados Linguagem de Montagem (IA32) Conjunto típico de instruções Modelo de execução de linguagem de alto nível Expressões, atribuições, estruturas de controle Chamada de procedimentos Pilha de execução, registro de ativação, parâmetros Representação de ponto flutuante Interação com SO, interrupções Compilação e Ligação