Compilando códigos C em MIPS

Propaganda
Anotações da 2a Edição
OBS: Essas anotações são adaptações do material
suplementar (apresentações PPT) ao Livro do
Hennessy e Patterson. Supõe-se que os estudantes
tenham noções de lógica digital e linguagem
assembly para o entendimento das aulas.
1
Parte 3
Baseado no Capítulo 2 – Computer Organization and
Design – The Hardware and Software Interface, 4ª Ed.
2
Seja o programa em C
// none of these allocate any storage
#define MAX_SIZE 256
#define IF(a)
if (a) {
#define ENDIF
}
typedef struct {
unsigned char red;
// 'unsigned char' is an unsigned, 8-bit int
unsigned char green;
unsigned char blue;
unsigned char alpha;
} RGBa;
// these allocate storage
int
i;
int
N = 20;
char
prompt[] = "Enter an integer:";
int
A[MAX_SIZE];
int*
pBArray;
int
BSize;
RGBa
background = {0xff, 0xff, 0xff, 0x0};
Fonte: http://www.cs.washington.edu/education/courses/cse378/03wi/lectures/mips-asm-examples.html
3
Layout da memória
4
•
•
•
•
De onde surgiu esse código?
Como ele foi compilado?
Como ele foi parar na memória?
Como ele começa a ser executado?
– Isso não faz parte do curso, mas vamos “abrir um parêntese”
para uma explicação rápida desses conceitos...
5
6
Processo de compilação típico
7
Iniciando um programa
8
Linkagem de arquivos objeto
9
Carregando um programa executável
Para carregar um executável, o SO
realiza os seguintes passos:
1.
2.
3.
4.
5.
6.
Lê o cabeçalho do arquivo executável e
determina o tamanho dos segmentos
de texto (código) e dados
Cria um espaço de endereçamento
grande o suficiente para texto (código)
e dados
Copia instruções e dados do arquivo
executável para a memória
Copia os parâmetros (seu houver) do
programa principal para a pilha
Inicializa os registradores e "seta" o
ponteiro da pilha para a primeira
alocação livre
Salta para a "rotina de start-up" que
copia os parâmetros nos registradores
de argumentos e chama a rotina
principal do programa
10
Ao final do processo...
•
•
Dados e instruções (MIPS, em nosso caso) estarão na memória
Mais questões:
–
–
–
–
Qual tipo de instrução?
Qual tipo de dado?
Fluxo de execução?
Entradas e saídas?
11
12
Instruções na Linguagem MIPS
13
Instruções
•
Instruções: palavras / vocabulário: conjunto de instruções
•
Programa armazenado: Dados e instruções de vários tipos podem ser
armazenados como números (binários) na memória
•
Instruções estão em Linguagem de Máquina (assembly)
– Muito Mais primitiva que linguagem de alto-nível
=> não há controles de fluxo sofisticados (for, while, etc...)
– Muito restritivas
=> Instruções aritméticas do MIPS (visto mais adiante)
•
Nós iremos trabalhar com o MIPS Instruction Set Architecture (ISA)
– Similar a outras arquiteturas desenvolvidas desde os 1980's
– Usada pela NEC, Nintendo, Silicon Graphics, Sony
– Foco nos princípios e não em detalhes específicos de ISA’s
Objetivo: maximizar desempenho e minimizar custo, reduzir tempo de design!
14
Instruções e Dados na memória
•
Dados e instruções (binários) estão na memória principal
•
Foram gerados a partir de um processo de compilação e carga na
memória
•
Alocação de espaço feita durante o processo de carga
– Compilador indica quantidade em bytes para as variáveis
– Sequência de instruções
– Endereço (relativo ao segmento do código compilado) de variáveis,
labels, rotinas, etc.
•
Uso frequente de instruções de LOAD (STORE) para trazer (levar) dados
da (para) memória para (dos) os registradores
•
Exemplos de acesso a variáveis usando a liguagem MIPS
15
Compilando códigos C em MIPS (1)
compilador C
a = b + c;
d = a – e;
add $s1,$s2,$s3
sub $s5,$s1,$s4
f = (g+h) – (i+j);
add $t0,$s0,$s1
add $t1,$s2,$s3
sub $s4,$t0,$t1
1.
2.
3.
4.
Compilador gera a(s) instrução(ões) correspondentes – assembly
Formato bastante rígido: add <soma, parcela, parcela>
Operandos em registradores
Registradores temporários
16
Compilando códigos C em MIPS (2)
•
•
•
Registradores armazenam variáveis do programa
Associação variável ↔ registrador feita pelo compilador
E se as variáveis f, g, h, i, j forem associadas aos
registradores $s0, $s1, $s2, $s3, $s4 como ficaria o código?
compilador C
f = (g+h) – (i+j);
1.
2.
3.
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t1, $t0
Registradores de tamanho de 1 palavra: 32 bits
Número limitado: 32 (numerados de 0 a 31 – 5 bits)
Registradores temporários
17
Compilando códigos C em MIPS (3)
•
Instruções de transferência de dados Memória ↔ registrador (CPU)
– Para acessar um dado, é necessário um endereço
•
Dois movimentos básicos: load (traz da ...) e store (leva para a memória)
•
•
No MIPS, acesso somente a blocos (palavras) de 32 bits (4 bytes)
Estruturas mais complexas tipo vetores e matrizes?
– Endereço de base e deslocamento
18
Compilando códigos C em MIPS (4)
•
Seja A um vetor de 100 palavras e as variáveis g e h associadas aos
registradores $s1 e $s2 como antes. O endereço de base de A está
armazenado no registrador $s3
compilador C
g = h + A[8];
Problema: Como encontrar valor
armazenado em A[8]?
lw $t0, 32($s3)
add $s1, $s2, $t0
19
Compilando códigos C em MIPS (5)
•
Seja A um vetor de 100 palavras e a variável h associada ao
registrador $s2. O endereço de base de A está armazenado no
registrador $s3
compilador C
A[12] = h + A[8];
lw $t0, 32($s3)
add $t0, $s2, $t0
sw
1.
2.
3.
$t0, 48($s3)
Uso do registrador temporário para armazenar resultado parcial
Acesso aos elementos do vetor: base e offset
A ordem dos operandos não é alterada para lw e sw
20
Compilando códigos C em MIPS (6)
•
•
Operandos constantes e imediatos: muito frequentes...
Seja a uma variável (contador de um programa, por ex) associada ao
registrador $s1.
compilador C
a = a + 1;
Outra opção?
addi
$s1, $s1, 1
lw $t0, EndConst_1
add $s1, $s1, $t0
Por que é pior?
Frequência de uso desse tipo de instrução?
– Fazer os casos comuns serem rápidos!
Faz sentido ter uma instrução do tipo subi
21
Alternativas para o Conjunto de Instruções
Queremos executar:
c = a + b
Existem várias opções para isso...
22
Impactos para o ISA
•
Muitas formas de endereçamento levam a tamanhos variados de
instrução:
– Flexibilidade para codificação
– Complexidade para decodificação
– Densidade das instruções (no. de bits)
– No. de acessos à memória
– Quantidade de “trabalho” por instrução
– Operandos podem estar na própria instrução
•
MIPS: Formas de endereçamento MUITO SIMPLES! Isso é uma
característica de arquiteturas RISC
23
Características associadas a um Conj. Inst.
1. Como interpretar os bits da memória:
– Little ou big endian
– Acesso a palavras ou a bytes
2. Endereçamento de operandos
3. Tipos de operações suportadas
4. Tamanhos e tipos de operandos
Como definir um conjunto de instruções “ideal” para uma arquitetura?
24
Até agora, para o ISA do MIPS...
25
Algumas reflexões sobre a escolha do conjunto de
instruções para uma arquitetura...
26
Sobre os modos de endereçamento
27
Exemplos de modos de endereçamento (1)
28
Exemplos de modos de endereçamento (2)
29
Com que frequência uso cada modo?
- SPEC89 sobre o VAX (um pouco antigo, mas muito ilustrativo...)
- Vários outros exemplos comparativos na referência básica
30
Distância (em bits) dos deslocamentos
31
Uso dos operandos imediatos
32
Tamanho dos operandos imediatos
33
Tipos/Tamanhos de operandos
34
Voltando à pergunta inicial
Como definir um conjunto de instruções “ideal” para uma arquitetura?
Balanceamento das seguintes características “desejáveis”:
1. Ter mais registradores e modos de endereçamento que possível
2. Avaliar o impacto do tamanho dos registradores e modos de
endereçamento no tamanho médio das instruções e do programa
3. Ter instruções codificadas em formatos que facilitem a sua
manipulação pelo hardware de controle da CPU (tamanhos fixos ou
múltiplos bytes)
•
Soluções MIPS => ver Capítulo 2.
35
Possibilidades de Operadores no Conj. Inst.
36
Instruções mais usadas
37
Números de Operandos em ISAs
38
Download