Instruções 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
Conjunto de Instruções MIPS
2
Aritmética MIPS
•
•
Todas as Instruções tem 3 operandos
Ordem dos operandos é fixa (destino sempre primeiro)
Exemplo:
C code:
C = A + B
MIPS code:
add $s0, $s1, $s2
(associado a variáveis definidas pelo compilador)
3
Aritmética MIPS
•
•
•
•
Princípios de design: simplicidade favorece a regularidade. Por que?
Obviamente, isto complica algumas coisas...
C code:
A = B + C + D;
E = F - A;
MIPS code:
add $t0, $s1, $s2
add $s0, $t0, $s3
sub $s4, $s5, $s0
Operandos devem ser registradores, e só existem 32 deles
Princípio de Projeto: quanto menor, mais rápido!
Por que?
4
Registradores x Memória
•
•
•
Operandos das Instruções Aritméticas devem ser registradores,
— Somente 32 registradores estão disponíveis
O Compilador associa variáveis com registradores...
O que significa um programa com muitas variáveis?
Control
Input
Memory
Datapath
Processor
Output
I/O
5
Organização da Memória
•
•
•
Memória: enorme vetor unidimensional acessado por endereços.
Endereço de memória = índice para o vetor
“Endereçar um Byte" = índice que aponta para um byte da memória.
0
1
2
3
4
5
6
...
8 bits of data
8 bits of data
8 bits of data
8 bits of data
8 bits of data
8 bits of data
8 bits of data
6
Organização da Memória
•
•
Bytes são interessantes, mas geralmente o acesso é feito a
“palavras” mais longas que 1 byte
Como vimos, para o MIPS, a palavra é de 32 bits (4 bytes).
•
•
•
0 32 bits of data
registradores armazenam 32 bits de dados
4 32 bits of data
8 32 bits of data
12 32 bits of data
...
232 bytes com endereços byte de 0 a 232-1
230 palavras com endereços 0, 4, 8, ... 232-4
Palavras são alinhadas:
Assim, o que representam os 2 bits menos significativos do
endereço de uma palavra?
7
Instruções
•
Instruções load (trazer de) e store (enviar para)
•
Exemplo:
•
•
C code:
A[12] = h + A[12];
MIPS code:
lw $t0, 36($s3)
add $t0, $s2, $t0
sw $t0, 36($s3)
O destino da palavra ($t0) a ser armazenada vem no início da
instrução sw
Lembre-se que todos os operandos aritméticos são registradores e
não endereços de memória!
8
Um 1o. Exemplo
•
Como poderíamos escrever esse código de troca de valor de duas
posições (k e k+1) de um vetor?
swap(int v[], int k);
{ int temp;
temp = v[k]
v[k] = v[k+1];
v[k+1] = temp;
}
swap:
muli $4, $5, 4
add $2, $4, $2
lw $15, 0($2)
lw $16, 4($2)
sw $16, 0($2)
sw $15, 4($2)
jr $31
9
Mas, aprendemos que:
•
MIPS
— Carrega palavras, mas acessa bytes
— Aritmética somente em registradores
•
Instrução
Significado
add $s1, $s2, $s3
sub $s1, $s2, $s3
lw $s1, 100($s2)
sw $s1, 100($s2)
$s1 = $s2 + $s3
$s1 = $s2 – $s3
$s1 = Memory[$s2+100]
Memory[$s2+100] = $s1
10
Instruções MIPS
•
•
•
Todas as instruções têm 32 bits
Todas têm opcode (código de instrução) de 6 bits
O modo de endereçamento é codificado juntamente com o opcode
31
26 25
0
opcode
11
Linguagem de Máquina
•
Instruções, assim como registradores de palavras de dados, tem
tamanho de 32 bits
– Exemplo: add $t0, $s1, $s2
– registradores têm números, $t0=8, $s1=17, $s2=18
•
Formato de uma Instrução R típico:
000000 10001
op
•
rs
Observe a ordem na instrução assembly
e na implementação! São diferentes!
10010
01000
00000
100000
rt
rd
shamt
funct
Você pode imaginar o que esses nomes (siglas) indicam?
op – código de operação
rs, rt – registradores fonte
rd – registrador destino
shamt – (shift amount) é usado em instruções de deslocamento
funct – código de função da ULA. É associado ao campo op (no caso de ULA é
00000)
12
Linguagem de Máquina
•
•
•
Considere as instruções load-word e store-word:
– O que o princípio da regularidade nos traz?
– Novo princípio: Bons projetos envolve um compromisso...
Introdução de um novo tipo de formato de Instrução
– Instruções tipo-I para transferência de dados (lw e sw)
– Outros formatos para instruções tipo-R para registradores
Exemplo: lw $t1, 32($s2)
1 0 0 0351 1 1 018
0 1 0 0 190 0 1
op
rs
rt
0 0 0 32
0000000100000
16 bit number
rs – registrador-base para o cálculo do endereço de memória
rt – registrador-destino (para lw) ou registrador-fonte (para sw)
•
Onde está o compromisso?
13
Controle de Fluxo no MIPS
•
•
Pontos de decisão podem criar instruções
– alterar o fluxo de controle,
– i.e., mudar a próxima instrução a ser executada
Endereço “destino” sempre especificado!
•
Instruções MIPS de desvio condicional:
bne $t0, $t1, Label
beq $t0, $t1, Label
•
Exemplo:
if (i!=j) h=i+j;
bne $s0, $s1, Label
...
Label: add $s3, $s0, $s1
...
14
Uso de instruções de controle
15
Controle de Fluxo
•
Instruções MIPS de desvio incondicional (jumps):
j Label
•
Exemplo:
if (i!=j)
h=i+j;
else
h=i-j;
•
beq $s4, $s5, Lab1
add $s3, $s4, $s5
j Lab2
Lab1: sub $s3, $s4, $s5
Lab2: ...
Você poderia pensar numa construção simples de um loop em MIPS?
16
Mais ainda:
•
•
Instrução
Significado
add $s1,$s2,$s3
sub $s1,$s2,$s3
lw $s1,100($s2)
sw $s1,100($s2)
bne $s4,$s5,L
beq $s4,$s5,L
j L
$s1 = $s2 + $s3
$s1 = $s2 – $s3
$s1 = Memory[$s2+100]
Memory[$s2+100] = $s1
Prox. instr. label L se $s4 != $s5
Prox. instr. label L se $s4 == $s5
Prox. instr. label L
Formatos:
R
op
rs
rt
I,J*
op
rs
rt
J
op
rd
shamt
funct
endereço 16 bit ou imediato
endereço de 26 bits
J* = desvio condicional
17
Controle do Fluxo
•
Temos: beq, bne
•
E se quisermos uma nova instrução do tipo branch-if-less-than?
slt $t0,$s1,$s2
if $s1 < $s2 then
$t0 = 1
else
$t0 = 0
Usando beq, bne e $t0 pode se implementar a “lógica requerida”
•
A Instrução pode ser usada para construir "blt $s1,$s2,Label"
— é possível se construir estruturas de controle genéricas
•
Note que o montador necessita de um registrador para fazer isso
— existem políticas de uso específicas para os registradores
18
Convenções e Política de Uso dos 32
Registradores MIPS
Nome
$zero
$v0-$v1
$a0-$a3
$t0-$t7
$s0-$s7
$t8-$t9
$gp
$sp
$fp
$ra
No.Registrador
0
2-3
4-7
8-15
16-23
24-25
28
29
30
31
Uso
valor constante 0
valores para resultados e avaliação de expressões
argumentos
temporários
salvos/armazenados
mais temporários
ponteiro global
ponteiro de pilha (stack pointer)
ponteiro de quadro (frame pointer)
endereço de retorno
OBS: Registro 1, chamado $at, é reservado para o montador. Os registros 26
e 27, chamados $k0 e $k1, são reservados para o Sistema Operacional
19
Constantes
•
Constantes pequenas são usadas frequentemente...
Ex:
A = A + 5;
B = B + 1;
C = C - 18;
•
Soluções?
– Colocar “constantes típicas” na memória e carregá-las.
– Criar registradores hard-wired para certas constantes: ex. $zero
•
Instruções MIPS para imediatos:
addi $29, $29, 4
slti $8, $18, 10
andi $29, $29, 6
ori $29, $29, 4
•
Como podemos fazer isso?
– Lembram-se da instrução muli do 1º exemplo (swap)
20
O que fazer com “grandes” constantes?
•
•
É possível carregar constantes de 32 bits em um registrador
Devem ser usadas 2 instruções para implementar isso:
1. Nova Instrução “load upper immediate”
lui $t0, 1010101010101010
1010101010101010
preenchida com zeros
0000000000000000
2. Depois, completar os bits de ordem mais baixa à direita, i.e.,
ori $t0, $t0, 1110101010101010
1010101010101010
0000000000000000
0000000000000000
1110101010101010
1010101010101010
1110101010101010
ori
21
Linguagem Assembly x Linguagem de Máquina
•
•
Assembly proporciona uma representação simbólica conveniente
– MUITO MAIS FÁCIL que escrever dígitos binários
– Ex: registrador destino é sempre o primeiro
Linguagem de Máquina está em outro nível de abstração
– Ex: destino não é preenchido primeiro na instrução tipo-R
•
Assembly disponibiliza apenas “pseudoinstruções”
– ex., “move $t0,$t1” existe somente em Assembly
– Poderia ser implementado usando “add $t0,$t1,$zero”
•
Quando se considera desempenho, deve-se pensar em “contar
instruções reais” em linguagem de máquina
22
Uso das instruções
23
Uso das instruções
24
Outras questões
•
Coisas que não estão sendo cobertas aqui:
– Suporte a procedures
– Carregadores (loaders), ligadores (linkers,), pilhas (stacks),
frames, recursão, etc.
– Manipulação de strings e ponteiros
– Interrupções e exceções
– Chamadas de sistema (system calls)
•
Alguns desses pontos serão tratados no futuro e em outros cursos
•
O foco agora está em questões ligadas à arquitetura:
– Básico da linguagem de máquina MIPS e código de máquina
– Construção de um processor para executar estas instruções.
25
Sumarização: Conjunto de Instruções MIPS
26
Visão Geral do MIPS
•
•
•
•
•
Instruções simples, todas com largura de 32 bits
Bastante estruturada, pouca “carga” desnecessária nas instruções
Somente 3 formatos de instrução
R
op
rs
rt
rd
I
op
rs
rt
16 bit address
J
op
shamt
funct
26 bit address
Apostar no compilador para obter desempenho
— Quais são os objetivos de um compilador?
Ajudar o compilador “no que nós queremos”...
27
Papel fundamental do Compilador
Sem otimizações
28
Endereços em Desvios (Branches) e Saltos (Jumps)
•
•
•
Instruções:
bne $t4,$t5,Label
beq $t4,$t5,Label
j Label
Prox Instr. está em Label se $t4$t5
Prox Instr. está em Label se $t4=$t5
Prox Instr. está em Label
Formatos:
I
op
J
op
rs
rt
16 bit address
26 bit address
Endereços não estão em 32 bits
— Como manipular isso para Instruções load e store?
29
Endereços em Desvios (Branches)
•
•
Instruções:
bne $t4,$t5,Label
beq $t4,$t5,Label
Prox Instr. está em Label se $t4$t5
Prox Instr. está em Label se $t4=$t5
Formatos:
I
op
rs
rt
16 bit address
•
Pode especificar um registrador (lw e sw) e adicioná-lo a um endereço
•
– Usar o Registrador de Endereço de Instrução (PC = program counter)
– 16 bits parece pouco, entretanto muitos desvios são “próximos”
(princípio da localidade)
Instruções Jump usam apenas os bits de mais alta ordem do PC
– Endereços limitados a 256 MB (pense no porquê...)
30
Sumário: Registradores MIPS
Nome
Exemplo
$s0-$s7, $t0-$t9, $zero,
32 registradores $a0-$a3, $v0-$v1, $gp,
$fp, $sp, $ra, $at
Memory[0],
30
2
memory
words
Memory[4], ...,
Memory[4294967292]
Comentários
Localizações rápidas de dados. No MIPS, os dados devem estar nos registradores
aritméticos. O Registrador $zero no MIPS é sempre igual a 0. Registrador $at é
reservado para o montador manipular constantes grandes.
Acessado somento por instruções de transferência de dados. MIPS usa endereços
de bytes, e palavras sequenciais diferenciam de 4.
Memória armazena estruturas de dados, como vetores, e registros encadeados,
como aqueles salvos em procedure calls.
31
Sumário: Assembly MIPS
Categoria
Arim ética
Transf. de
dados
add
subtract
Linguagem Assembly MIPS
Exemplo
Significado
add $s1, $s2, $s3
$s1 = $s2 + $s3
sub $s1, $s2, $s3
$s1 = $s2 - $s3
3 operandos; dados em registradores
3 operandos; dados em registradores
add immediate
addi $s1, $s2, 100 $s1 = $s2 + 100
Usado para adicionar constantes
load w ord
store w ord
load byte
store byte
load upper
immediate
lw
sw
lb
sb
Palavra da memória para registrador
Palavra do registrador para memória
Byte da memória para registrador
Byte do registrador para memória
Carregar constante no 16 bits
superiores
branch on equal
beq
Instrução
$s1,
$s1,
$s1,
$s1,
100($s2)
100($s2)
100($s2)
100($s2)
lui $s1, 100
$s1 = Memory[$s2 + 100]
Memory[$s2 + 100] = $s1
$s1 = Memory[$s2 + 100]
Memory[$s2 + 100] = $s1
$s1 = 100 * 2 16
if ($s1 == $s2) go to
PC + 4 + 100
if ($s1 != $s2) go to
$s1, $s2, 25
PC + 4 + 100
if ($s2 < $s3) $s1 = 1;
$s1, $s2, $s3
else $s1 = 0
$s1, $s2, 25
Comentário
Teste de igualdade; desvio PC-relativo
Teste de Desigualdade; desvio PCrelativo
Desvio
branch on not equal bne
Condicional
set on less than
slt
set less than
immediate
jump
slti $s1, $s2,
100
j
2500
if ($s2 < 100) $s1 = 1;
else $s1 = 0
Constante na comparação menor que
go to 10000
Saltar para o endereço alvo
jump register
jr
$ra
go to $ra
Para escolha, retorno de procedimento
jal
2500
$ra = PC + 4; go to 10000
Para chamada de procedimento
Desvio
Incondicional jump and link
Comparar menor que; para beq, bne
32
Mais detalhes sobre formas de endereçamento MIPS
1. Immediate addressing
op
rs
rt
Immediate
2. Register addressing
op
rs
rt
rd
...
funct
Registers
Register
3. Base addressing
op
rs
rt
Memory
Address
+
Register
Byte
Halfword
Word
4. PC-relative addressing
op
rs
rt
Memory
Address
PC
+
Word
33
op
rs
rt
Memory
Address
Detalhes sobre formas de
+ endereçamento
Byte
Register
Halfword
Word
4. PC-relative addressing
op
rs
rt
Memory
Address
PC
+
Word
5. Pseudodirect addressing
op
Address
PC
Memory
Word
34
Arquiteturas Alternativas
•
Projetos alternativos:
– Prover operações mais poderosas
– Objetivo: reduzir o número de Instruções executadas
– Perigo é aumentar o tempo de ciclo e/ou aumentar o CPI
•
Algumas vezes associado ao confronto “RISC x CISC”
– Virtualmente, todos os Conjuntos de Instruções de 1982 a 95 foram RISC
– VAX: minimizar o tamanho do código, de forma a tornar a linguagem
assembly mais fácil
Instruções de tamanho 1 a 54 bytes!
Para que assembly mais fácil?
•
Rapidamente, olhar as arquiteturas PowerPC e 80x86 (detalhes no livro do
Sttalings)
35
PowerPC
•
Endereçamento Indexado
– Ex:
lw $t1,$a0+$s3
#$t1=Memory[$a0+$s3]
– Como isso seria feito no MIPS?
•
•
Atualizar endereçamento
– Atualizar um registrador como parte da carga (para andar através
de arrays)
– Ex: lwu $t0,4($s3) #$t0=Memory[$s3+4];$s3=$s3+4
– Como isso seria feito no MIPS?
Outros:
– Múltiplos load/store
– Um registrador contador especial “bc Loop”
decrementa contador, se != 0 goto loop
36
80x86
•
•
•
•
•
•
1978: O Intel 8086 é anunciado (arquitetura 16 bit)
1980: O coprocessador 8087 floating point é adicionado
1982: O 80286 amplia o espaço de endereçamento para 24 bits, +
Instruções
1985: O 80386 estende para 32 bits, novos modos de endereçamento
1989-1995: O 80486, Pentium, Pentium Pro adicionam poucas
Instruções
(maioria delas projetadas para ganho de desempenho)
1997: MMX é adicionado
“This history illustrates the impact of the “golden handcuffs” of compatibility
adding new features as someone might add clothing to a packed bag an architecture that
is difficult to explain and impossible to love” (Hennessy & Patterson)
37
A arquitetura dominante: 80x86
•
•
•
Leia o livro texto para uma descrição mais detalhada
Complexidade:
– Instruções com tamanho de 1 a 17 bytes
– 1 operando pode funcionar como fonte e destino
– 1 operando pode vir da memória
– Modos de endereçamento complexos
Ex: índice de base ou de escala com deslocamento de 8 ou 32 bits
Pontos interessantes:
– As instruções mais frequentemente usadas não são tão difíceis
de construir
– Compiladores evitam porções da arquitetura que são lentas
“what the 80x86 lacks in style is made up in quantity, making it beautiful from
the right perspective” (Hennessy & Patterson)
38
Sumário
•
•
•
Complexidade da Instrução é apenas UMA das variáveis
– Número de instruções mais baixo vs. alto CPI / taxa de clock
mais baixa
Princípios de projeto:
– Simplicidade favorece regularidade
– Quanto menor, mais rápido
– Um bom projeto implica em compromisso
– Fazer o caso comum mais rápido
Conjunto de Instruções da Arquitetura (Instruction Set Architecture)
– Uma abstração MUITO importante!
39
Download