Parte 3

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
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!
5
Compilando códigos C em MIPS (1)
compilador C
a = b + c;
d = a – e;
add a, b, c
sub d, a, e
f = (g+h) – (i+j);
add $t0, g, h
add $t1, i, j
sub f, $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
6
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
7
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
8
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
9
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
10
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
11
Alternativas para o Conjunto de Instruções
Queremos executar:
c = a + b
12
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
13
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?
14
Até agora, para o ISA do MIPS...
15
Algumas reflexões sobre a escolha do conjunto de
instruções para uma arquitetura...
16
Sobre os modos de endereçamento
17
Exemplos de modos de endereçamento (1)
18
Exemplos de modos de endereçamento (2)
19
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
20
Distância (em bits) dos deslocamentos
21
Uso dos operandos imediatos
22
Tamanho dos operandos imediatos
23
Tipos/Tamanhos de operandos
24
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.
25
Possibilidades de Operadores no Conj. Inst.
26
Instruções mais usadas
27
Números de Operandos em ISAs
28
Download