Professional Documents
Culture Documents
Arquitetura MIPS
MIPS Microprocessor without Interlocking Pipes
Stages (Microprocessador sem
Intertravamento entre os estgios de pipe)
MIPS uma marca registrada da MIPS Technology
MIPS inspirada na arquitetura RISC Reduced
Instruction Set Computer (Computador com conjunto
de instrues reduzidas)
1981
Pastilhas
RISC I e
RISC II
Instrues no MIPS
No MIPS, instruo uma palavra da linguagem
de mquina.
Vocabulrio o conjunto de instrues (instruction
set)
Instruction Set do MIPS (usado pela NEC, Nintendo,
Silicon Graphics e Sony)
5
Assembly MIPS
a = b + c;
d = a c;
add a,b,c
sub d,a,c
Princpio de Projeto 1:
A simplicidade favorecida pela regularidade.
6
Assembly MIPS
f = (b + c) (i + j);
add t0,g,h
add t1,i,j
sub f,t0,t1
Operandos no MIPS
No MIPS so 32 registradores de 32 bits ($0 ... $31)
(no h suporte em hardware para o conceito de varivel)
Programa em C
Assembly MIPS
f = (b + c) (i + j);
add $t0,$s1,$s2
add $t1,$s3,$s4
sub $s0,$t0,$t1
Princpio de Projeto 2:
Quanto menor, mais rpido manter o nmero de
registradores to pequeno quanto possvel.
8
Formatos:
lw <registrador> <deslocamento>(<registrador>)
sw <registrador> <deslocamento>(<registrador>)
9
Soluo:
Primeiro devemos carregar um registrador temporrio com A[8]:
lw $t0,32($s3) # $t0 recebe A[8]
Agora basta executar a operao:
add $s1,$s2,$t0 # g recebe h + A[8]
10
Continuao...
Notas:
Devido limitao quanto quantidade
de registradores, estruturas de dados tais
como, arrays so mantidos em memria.
A constante que aparece na instruo lw
o deslocamento, e o registrador cujo valor
armazenado somado a esta constante
chamado de registrador-base.
11
Endereamento no MIPS
No MIPS a memria organizada em bytes,
embora endereamento seja em palavras de
4 bytes (32 bits) restrio de alinhamento.
PROCESSADOR
...
...
12
100
10
101
Endereo DADOS
Memria
12
Continuao...
As mquinas que endeream bytes podem
dividir-se em duas categorias: aquelas que
usam o byte mais esquerda (big endian) e
aquelas que o byte mais direita (little
endian). O MIPS est na categoria das
mquinas big endians.
13
Soluo:
lw $t0,32($s3) # $t0 recebe A[8]
add $t0,$s2,$t0 # $t0 recebe h + A[8]
sw $t0,48($s3) # A[12] = h + A[8]
14
Soluo:
add $t1,$s4,$s4
add $t1,$t1,$t1
add $t1,$t1,$s3
lw $t0,0($t1)
add $s1,$s2,$t0
#
#
#
#
#
$t1 recebe 2 * i
$t1 recebe 4 * i
$t1 recebe o end. de A[i]
$t0 recebe A[i]
g recebe h + A[i]
15
Representao de instrues no
COMPUTADOR
Registradores $s0..$s7 16..23
Registradores $t0..$t7 8..15
Exemplo:
Formato da instruo:
add $t1, $s1, $s2 # $t1 recebe $s1 + $s2
16
Continuao...
Representao da Instruo em Decimal
0
.
.
.
.
.
17
18
$s1 $s2
.
.
.
.
.
.
$t0 no
. usado
.
.
.
.
32
Cdigo
da
adio
.
.
.
.
.
17
5 bits
5 bits
op
rs
rt
5 bits
rd
5 bits
6 bits
shamt funct
Onde:
op
operao bsica da instruo (opcode)
rs
o primeiro registrador fonte
rt
o segundo registrador fonte
rd
o registrador destino
shamt para instrues de deslocamento (shift amount)
funct seleciona variaes da operao especificada
pelo opcode (function)
18
Continuao...
I-type
6 bits
op
5 bits
rs
5 bits
rt
16 bits
endereo
Princpio de Projeto 3:
Um bom projeto demanda compromisso. compromisso
escolhido pelos projetistas do MIPS foi manter todas as
instrues do mesmo tamanho.
Exemplo de instruo I-type: lw $st0,32($s3)
19
Representao de instrues no
COMPUTADOR
Inst.
Formato
op
rs
rt
rd
Shamt
Func.
End.
add
reg
reg
reg
32
n.d.
sub
reg
reg
reg
34
n.d.
lw
35
reg
reg
n.d.
n.d.
n.d.
end.
sw
43
reg
reg
n.d.
n.d.
n.d.
end.
20
10
Continuao...
Exemplo :
D o cdigo assembly do MIPS e o cdigo de mquina para o
seguinte comando em C: A[300] = h + A[300];
onde $t1 tem o endereo base do vetor A e $s2 corresponde
a h.
Soluo :
lw $t0,1200($t1)
add $t0,$s2,$t0
sw $t0,1200($t1)
Continuao...
Linguagem de Mquina
op
rs
rt
35
18
43
rd
end/shamt funct
1200
32
1200
22
11
23
24
12
Continuao...
Linguagem C
if (i == j) goto L1;
f = g + h;
L1: f = f i;
# v para Else se i != j
# f = g + h, se i != j
# v para Exit
# f = g h, se i = j
26
13
Loops (laos)
Usando if
Exemplo : Loop: g = g + A[i];
i = i + j;
if (i != h) goto Loop;
Loops (laos)
Usando while
Exemplo : while (save[i] == k) i = i + j;
Soluo: Para i, j e k correspondendo a $s3, $s4 e $s5,
respectivamente, e o endereo base do array
em $s6, temos:
Loop: add $t1,$s3,$s3
add $t1,$t1,$t1
add $t1,$t1,$s6
lw $t0,0($t1)
bne $t0,$s5,Exit
add $s3,$s3,$s4
j
Loop
Exit:
# st1 = 2 * i
# $t1 = 4 * i0
# $t1 recebe endereo de save[i]
# $t0 recebe save[i]
# v para Exit se save[i] != k
#i=i+j
28
14
Comando Seletivo
Exemplo : Compilando o comando switch
Seja o comando abaixo:
switch (k) {
case 0: f = i + j; break;
case 1: f = g + h; break;
}
Suponha que as seis variveis correspondam aos registradores
de $s0 a $s5, e que o registrador $t2 contenha o valor 2.
Qual o cdigo correspondente na linguagem de montagem do
MIPS?
30
15
Continuao...
Soluo :
slt $t3,$s5,$zero
bne $t3,$zero,Exit
# teste se k < 0
# se k < 0 v para Exit
slt $t3,$s5,$t2
bne $t3,$zero,Exit
# teste se k < 2
# se k >= 2 v para Exit
add $t1,$s5,$s5
add $t1,$t1,$t1
# $t1 = 2 * k
# $t1 = 4 * k
31
Continuao...
# assumindo que 4 palavras na memria, comeando no
endereo contido em $t4, tem endereamento
correspondente a L0, L1 e L2
add $t1,$t1,$t4
lw $t0,0($t1)
jr $t0
L0: add $s0,$s3,$s4
j
Exit
L1: add $s0,$s1,$s1
Exit:
32
16
Suporte a Procedimento
Para a execuo de um procedimento deve-se:
Colocar os parmetros em um local onde o procedimento
possa acess-los;
Transferir o controle ao procedimento;
Adquirir os recursos necessrios ao procedimento;
Executar a tarefa;
Colocar o resultado em um local onde o programa possa
acess-lo;
Retornar o controle ao ponto onde o procedimento foi
chamado.
33
Continuao...
Para este mecanismo, o MIPS aloca seus registradores,
para chamada de procedimentos, da seguinte maneira:
$a0..$a3 4 registradores para passagem de argumentos
$v0..$v1 2 registradores para retornar valores
$ra para guardar o endereo de retorno
Instruo para chamada de Procedimento
jal End_Proc (jump-and-link) desvia para o procedimento
e salva o endereo de retorno (PC+4) em $ra (return address
- $31)
34
17
Continuao...
Instruo para chamada de Procedimento
jr $ra desvia para o ponto de onde foi chamado o
procedimento.
Qual o problema para chamadas aninhadas?
R. O registrador $ra destrudo.
$sp
Qual a soluo?
R. Utilizar uma PILHA.
stack
Continuao...
Exemplo:
Seja o procedimento abaixo:
int exemplo (int g, int h, int i, int j)
{
int f;
f = (g + h) (i + j);
return f;
}
36
18
Continuao...
Soluo:
Os parmetros g, h, i e j correspondem a $a0..$a3,
respectivamente e f a $s0.
Antes precisaremos salvar $s0, $t0 e $t1 na pilha, pois
sero usados no procedimento.
sub $sp,$sp,12
sw $t1,8($sp)
sw $t0,4($sp)
sw $s0,0($sp)
Continuao...
No procedimento
add $t0,$a0,$a1
add $t1,$a2,$a3
sub $s0,$t0,$t1
Para retornar o valor f
add $v0,$s0,$zero
Retornar
jr $ra
38
19
Continuao...
$sp
Contedo
do reg. $t1
$sp
$sp
Contedo
do reg. $t0
Contedo
do reg. $s0
Continuao...
Observaes:
$t0..$t9 10 registradores temporrios que no so
preservados em uma chamada de procedimento
$s0..$s7 8 registradores que devem ser preservados
em uma chamada de procedimento
20
Continuao...
Soluo:
Fact: sub $sp,$sp,8
sw $ra,4($sp)
sw $a0,0(sp)
slt $to,$a0,1
beq $t0,$zero,L1
add $sp,$sp,8
jr
$ra
L1: sub $a0,$a0,1
jal fact
lw $ra,4($sp)
add $sp,$sp,8
mult $vo,$a0,$vo
jr
$ra
# ajuste da pilha
# salva o endereo de retorno
# salva o argumento n
# teste para n < 1
# se n >= 1, v para L1
# pop 2 itens da pilha
# n>= 1, n-1
# chamada com n-1
Continuao...
Alocao
Registradores no Preservados
Salvos: $s0-$s7
Apontador para pilha: $sp
Endereo de retorno: $ra
Pilha acima do Apontador para pilha
Temporrios: $t0-$t7
Argumentos: $a3
Valores de retorno: $v0-$v1
Pilha abaixo do apontador para Pilha
42
21
Continuao...
Memria alta
$fp
$sp
$fp
$sp
registradores
de argumentos
salvos
endereo de
retorno salvo
$fp
$sp
registradores
de salvamento
salvos
arrays e
estruturas
locais
Memria baixa
Pilha antes, durante e depois da chamada de procedimento
43
Nmero
Uso
Preservados em
chamadas?
n.d.
$zero
Constante 0
$v0-$v1
2-3
No
$a0-$a3
$t0-$t7
$s0-$s7
4-7
8-15
16-23
Resultados e avaliaes de
expresses
Argumentos
Temporrios
Salvos
$t8-$t9
$gp
$sp
24-25
28
29
Temporrios
Ponteiro Global
Ponteiro par Pilha
No
Sim
Sim
$fp
30
Sim
$ra
31
Endereo de Retorno
Sim
Sim
No
Sim
44
22
Continuao...
Operandos Imediatos ou Constantes:
Motivao:
muito comum que programas usem constantes em diversas
operaes que ocorrem com muita freqncia, tais como, o
incremento de um ndice para faz-lo apontar para o prximo
elemento de um array, a contagem de iteraes de um lao, ou
o ajuste do stack pointer em chamadas a procedimentos
aninhados.
Para utilizar uma constante qualquer, e com base somente nas
instrues abordadas anteriormente, necessrio uma busca
na memria, para carreg-la em um registrador, antes que se
possa utiliz-la. Considere o exemplo a seguir.
46
23
Continuao...
Exemplo:
Para somar a constante 4 ao contedo do registrador $sp,
poderamos usar o seguinte cdigo:
lw $t0,addrConstant4($zero) # $t0 recebe a constante 4
add $sp,$sp,$t0
# $sp recebe $sp + 4 (em $t0)
Uma alternativa, que evita acessos memria, oferecer, no
conjunto de instrues, verses de instrues aritmticas nas
quais um dos operandos uma constante, mantida dentro da
prpria instruo. Considerando o exemplo acima, temos:
addi $sp,$sp,4
47
Continuao...
Exemplo: instruo addi (add immediate)
Na instruo add do tipo I, chamada addi (add immediate), um
dos seus operandos uma constante (ou um imediato).
Para somar 4 a $sp temos: addi $sp,$sp,4
Cdigo de mquina para addi (em decimal)
8
opcode
6 bits
29
rs
5 bits
29
rt
5 bits
4
imediato
16 bits
48
24
Continuao...
Operandos imediatos em comparaes:
Os operandos imediatos tambm so muito usados em
comparaes. Como o registrador $zero sempre contm a
constante 0, fcil comparar um determinado valor com 0.
Para comparar com outros valores que no 0, existe uma
verso imediata da instruo set on less than. Por exemplo:
slti $t0,$s2,10 # $t0 recebe 1 se $s2 < 10
Continuao...
Exemplo 1: carga de uma constante de 16 bits
lui $t0,255 # carrega 255 nos 16 bits de mais alta ordem de $t0
Cdigo de Mquina da instruo lui (I-type)
001111
00000
01000
0000 0000 1111 1111
6 bits
$t0
5 bits
5 bits
16 bits - imediato
25
Continuao...
Exemplo 2: carga de uma constante de 32 bits
Qual o cdigo MIPS para carregar uma cte. de 32 bits em $s0?
Soluo:
Considere a constante: 0000 0000 0011 1101 0000 1001 0000 0000, o
primeiro passo carregar os 16 bits de mais ordem em $s0.
lui $s0,61 # 61 dec. = 0000 0000 0011 1101 binrio.
O prximo passo somar ao contedo de $s0 o valor 2.304.
addi $s0,$s0,2304 # 2304 dec. = 0000 1001 0000 0000 binrio.
51
Continuao...
Endereamento nos desvios incondicionais
(jumps) e condicionais (branchs):
Considere a instruo de desvio incondicional abaixo.
j 10000 # desvia para o endereo 10.000
A respectiva instruo (J-type) em cdigo de mquina :
2
6 bits
10000
26 bits
52
26
Continuao...
Considere a instruo de desvio condicional abaixo.
bne $s0,$s1,Exit
Continuao...
De modo a aumentar o domnio da variao dos
endereos- alvo de desvio condicional, uma possvel
soluo de contorno seria utilizar um registrador (no
caso o PC) e somar seu contedo ao campo de 16
bits correspondente a instruo de desvio condicional.
Desse modo, numa instruo de desvio condicional o
montador deve calcular:
PC PC + Campo do Endereo, onde o Campo do
Endereo em unidades de palavras (4 bytes).
Esta forma de implementar o endereo de desvio em
uma instruo de desvio condicional chamada de
endereamento relativo ao PC.
54
27
Continuao...
Exemplo: endereamento relativo ao PC em um loop while.
Loop: add $t1,$s3,$s3
add $t1,$t1,$t1
add $t1,$t1,$s5
lw $t0,0($t1)
bne $t0,$s5,Exit
add $s3,$s3,$s4
j
Loop
Exit:
# $t1 recebe 2 * i
# $t1 recebe 4 * i
# $t1 recebe endereo de save[i]
# $t0 recebe save[i]
# v para Exit se save[i] k
# i recebe i + j
Continuao...
Soluo : Cdigo de Mquina para o loop while.
80000
80004
80008
80012
80016
80020
80024
80028
0
0
0
35
5
0
2
19
9
9
9
8
19
19
9
21
8
21
20
9
9
9
19
80000
0
0
0
0
2
0
32
32
32
32
...
28
Continuao...
Desviando para mais longe
Exemplo :
Considere uma instruo de desvio condicional que desvie para
um label se o contedo de $s0 for igual a $s1, como segue:
beq $s0,$s1,L1
Pode-se substituir esta construo por um par de instrues de
forma a possibilitar desviar para muito mais longe, como:
bne $s0,$s1,L2
j
L1
L2:
57
29
59
Traduzindo um Programa
Etapas:
1) Programa C => COMPILADOR => Programa Assembly
2) Programa Assembly => ASSEMBLER => Mdulo em LM
3) Mdulo em LM+Library em L.M. => LINKER => Executvel
4) Executvel => LOADER => Programa em Memria.
FIM.
60
30