Introduçãorogerio/material_auxiliar/SB20122_al3... · (por exemplo para E/S) Um montador ou...

Preview:

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

Recommended