Upload
doanque
View
218
Download
0
Embed Size (px)
Citation preview
Introdução
Software BásicoAula 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.
• x2 > 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 (){ long int a[2]; double d = 3.14; a[2] = 1073741824; /* Referência “out of bounds” */ printf("d = %.15g\n", d); exit(0);}
main (){ long int a[2]; double d = 3.14; a[2] = 1073741824; /* Referência “out of bounds” */ printf("d = %.15g\n", d); 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 demontagem
Onde a gente vai se debruçar
Representação de dados,mecanismos de controle,
funções, pilha,variáveis locais
Linguagem demontagem
InterrupçõesInteração com
SO
Onde a gente vai se debruçar
Representação de dados,mecanismos de controle,
funções, pilha,variáveis locais
Linguagem demontagem
InterrupçõesInteraçã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: 232 = 4.294.967.296– Registradores de 64 bits: 264 = 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