O documento descreve instruções em assembly MIPS para condicionais e laços. Ele explica que existem dois tipos de condicionais em MIPS (beq e bne) e fornece exemplos de como implementar estruturas if/else. Também mostra como implementar laços while usando desvios para rótulos já definidos no código.
1. Arquitetura de Computadores
ACH2055
Aula 04 – Assembly MIPS (Parte II)
Norton Trevisan Roman
(norton@usp.br)
1 de novembro de 2019
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 1 / 40
3. Programando em MIPS
Condicionais
Existem 2 condicionais em MIPS
Ambos do tipo I (immediate)
beq reg1, reg2, r´otulo
branch on equal
V´a ao r´otulo se o valor em reg1 for igual ao valor em reg2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 2 / 40
4. Programando em MIPS
Condicionais
Existem 2 condicionais em MIPS
Ambos do tipo I (immediate)
beq reg1, reg2, r´otulo
branch on equal
V´a ao r´otulo se o valor em reg1 for igual ao valor em reg2
bne reg1, reg2, r´otulo
branch on not equal
V´a ao r´otulo se o valor em reg1 for diferente do valor em reg2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 2 / 40
5. Programando em MIPS
Condicionais – Exemplo
if (i==j) f = g + h; else f = g - h;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
6. Programando em MIPS
Condicionais – Exemplo
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
7. Programando em MIPS
Condicionais – Exemplo
Definimos as vari´aveis
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
8. Programando em MIPS
Condicionais – Exemplo
Em geral, ´e mais f´acil
testar a condi¸c˜ao
oposta, para j´a
desviar ao else
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
9. Programando em MIPS
Condicionais – Exemplo
Nesse caso, para
o r´otulo bati-
zado como Else
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
10. Programando em MIPS
Condicionais – Exemplo
E ent˜ao, se a condi¸c˜ao
oposta n˜ao for
satisfeita, prosseguir
com o c´odigo do if
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
11. Programando em MIPS
Condicionais – Exemplo
E desviar dire-
tamente `a sa´ıda
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
12. Programando em MIPS
Condicionais – Exemplo
j r´otulo (jump)
corresponde a um
desvio incondicional `a
posi¸c˜ao de mem´oria
definida pelo r´otulo
if (i==j) f = g + h; else f = g - h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 3 / 40
13. Programando em MIPS
Condicionais – Exemplo
E se n˜ao houvesse o else?
if (i==j) f = g + h;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
14. Programando em MIPS
Condicionais – Exemplo
E se n˜ao houvesse o else?
if (i==j) f = g + h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Saida
add $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
15. Programando em MIPS
Condicionais – Exemplo
Far´ıamos um desvio
condicional ao restante
do c´odigo, como se o
restante fosse o else
E se n˜ao houvesse o else?
if (i==j) f = g + h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Saida
add $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
16. Programando em MIPS
Condicionais – Exemplo
Note que, mesmo
executando o
corpo do if, a
instru¸c˜ao no r´otulo
Sa´ıda ser´a rodada
E se n˜ao houvesse o else?
if (i==j) f = g + h;
.text
li $s0, 4 # vari´avel f
li $s1, 5 # vari´avel g
li $s2, 2 # vari´avel h
li $s3, 3 # vari´avel i
li $s4, 3 # vari´avel j
bne $s3, $s4, Saida
add $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 4 / 40
17. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
18. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
19. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
20. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
21. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
22. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
23. Programando em MIPS
Condicionais – Outro Exemplo
if ( i < j )
a = b + c;
else
a = b - c;
.text
li $s0, 4 # variavel a
li $s1, 5 # variavel b
li $s2, 2 # variavel c
li $s3, 2 # variavel i
li $s4, 3 # variavel j
slt $t0, $s3, $s4
beq $t0, $zero, Else
add $s0, $s1, $s2
j Saida
Else: sub $s0, $s1, $s2
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 5 / 40
24. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
25. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
26. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
27. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
28. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
29. Programando em MIPS
La¸cos
La¸cos nada mais s˜ao que desvios a partes j´a rodadas
do c´odigo:
i = 0;
while (i < 5)
i++;
.text
li $t0, 0
Laco: slti $t1, $t0, 5
beq $t1, $zero, Saida
addi $t0, $t0, 1
j Laco
Saida:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 6 / 40
30. Programando em MIPS
Instru¸c˜oes Relacionais Revista
MIPS usa slt, slti, beq e bne, al´em do valor 0,
para criar todas as opera¸c˜oes relacionais
==, =, <, >, ≤, ≥
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 7 / 40
31. Programando em MIPS
Instru¸c˜oes Relacionais Revista
MIPS usa slt, slti, beq e bne, al´em do valor 0,
para criar todas as opera¸c˜oes relacionais
==, =, <, >, ≤, ≥
N˜ao h´a um branch on less than por ser complicado
Ou aumentaria o ciclo do clock, ou exigiria ciclos extras por
instru¸c˜ao
2 instru¸c˜oes mais r´apidas s˜ao mais ´uteis
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 7 / 40
32. Programando em MIPS
Desvios Incondicionais
Al´em de j r´otulo, h´a outros 2 desvios
incondicionais importantes
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 8 / 40
33. Programando em MIPS
Desvios Incondicionais
Al´em de j r´otulo, h´a outros 2 desvios
incondicionais importantes
jr registrador
jump register
Desvio incondicional ao endere¸co especificado em um
registrador
jr $s2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 8 / 40
34. Programando em MIPS
Desvios Incondicionais
jal endere¸co do procedimento
jump and link
Carrega em $ra o valor de PC + 4 (Program Counter) e
ent˜ao desvia para a instru¸c˜ao no endere¸co-alvo
$ra cont´em ent˜ao o endere¸co da instru¸c˜ao seguinte ao jal no
c´odigo
Usada em chamadas a sub-rotinas
jal rotulo
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 9 / 40
35. Programando em MIPS
Sub-rotinas
Na execu¸c˜ao de uma sub-rotina, precisamos:
Colocar os parˆametros onde ela possa acessar
Transferir o controle a ela
Alocar a mem´oria necess´aria a ela
Executar a tarefa desejada
Colocar o resultado em um lugar onde quem chamou a
sub-rotina possa encontrar
Devolver o controle ao ponto de origem
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 10 / 40
36. Programando em MIPS
Sub-rotinas
Para auxiliar nessa tarefa, MIPS apresenta a
seguinte conven¸c˜ao de uso de registradores:
$a0 - $a3: parˆametros da sub-rotina
$v0 e $v1: valores de retorno
$ra: endere¸co para retorno ao ponto de origem
$fp: ponteiro para a moldura de pilha (j´a veremos)
$sp: ponteiro para o topo da pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 11 / 40
37. Programando em MIPS
Sub-rotinas
O procedimento a ser seguido ´e, ent˜ao:
A rotina que faz a chamada coloca os parˆametros em $a0 -
$a3
Ela ent˜ao executa “jal X” para ir `a sub-rotina X
A sub-rotina executa seus c´alculos, colocando os resultados
em $v0 e $v1
Ela ent˜ao devolve o controle `a rotina original, executando
“jr $ra”
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 12 / 40
38. Programando em MIPS
Sub-rotinas – Problemas
Existe um n´umero pequeno de registradores de uso
geral → podem vir a ser sobrescritos
Como preservar a informa¸c˜ao anterior?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 13 / 40
39. Programando em MIPS
Sub-rotinas – Problemas
Existe um n´umero pequeno de registradores de uso
geral → podem vir a ser sobrescritos
Como preservar a informa¸c˜ao anterior?
Com chamadas aninhadas, o pr´oprio $ra ´e
sobrescrito
Como saber para onde retornar, ap´os o t´ermino de uma
dessas chamadas?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 13 / 40
40. Programando em MIPS
Sub-rotinas – Problemas
Existe um n´umero pequeno de registradores de uso
geral → podem vir a ser sobrescritos
Como preservar a informa¸c˜ao anterior?
Com chamadas aninhadas, o pr´oprio $ra ´e
sobrescrito
Como saber para onde retornar, ap´os o t´ermino de uma
dessas chamadas?
Podemos querer passar mais de 4 parˆametros
Como fazer essa passagem?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 13 / 40
41. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
42. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Fonte: Adaptado de [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
43. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Iniciando no maior endere¸co
poss´ıvel
Iniciada manualmente ou pelo
SO
Fonte: Adaptado de [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
44. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
A solu¸c˜ao ´e armazenar em
mem´oria, em uma pilha
Iniciando no maior endere¸co
poss´ıvel
Iniciada manualmente ou pelo
SO
´E de suma importˆancia haver
uma conven¸c˜ao para isso
Fonte: Adaptado de [1]
Para que cada rotina e sub-rotina saiba onde encontrar o
que busca
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 14 / 40
45. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
A regi˜ao da pilha destinada
ao gerenciamento de uma
determinada rotina ´e
denominada Moldura de
Pilha
Guardando ent˜ao os registradores
salvos, vari´aveis locais e
argumentos passados `a
sub-rotina que ser´a chamada
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 15 / 40
46. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Em MIPS, gerenciada via 2
registradores
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 16 / 40
47. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Em MIPS, gerenciada via 2
registradores
$sp
Stack pointer
Cont´em o endere¸co da ´ultima
palavra da pilha → seu topo Fonte: [1]
Necess´ario para que se saiba onde empilhar nova moldura
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 16 / 40
48. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
$fp
Frame pointer
Cont´em o endere¸co da primeira
palavra da moldura
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 17 / 40
49. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
$fp
Frame pointer
Cont´em o endere¸co da primeira
palavra da moldura
A moldura do topo vai ent˜ao
do $fp ao $sp Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 17 / 40
50. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
´E necess´ario mesmo haver
um $fp?
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 18 / 40
51. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
´E necess´ario mesmo haver
um $fp?
N˜ao se pudermos acessar toda a
moldura a partir do $sp
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 18 / 40
52. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
´E necess´ario mesmo haver
um $fp?
N˜ao se pudermos acessar toda a
moldura a partir do $sp
Mas lembre que num
lw reg, desl(reg)
temos 16 bits para o
deslocamento
Sendo 1 o de sinal
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 18 / 40
53. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Isso nos diz que o m´aximo
que podemos acessar ´e o
endere¸co $sp + 32KB (211
)
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 19 / 40
54. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Isso nos diz que o m´aximo
que podemos acessar ´e o
endere¸co $sp + 32KB (211
)
Se a moldura for maior, ser´a
necess´ario o uso do $fp
E assim permitimos molduras de
at´e 64KB
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 19 / 40
55. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Isso nos diz que o m´aximo
que podemos acessar ´e o
endere¸co $sp + 32KB (211
)
Se a moldura for maior, ser´a
necess´ario o uso do $fp
E assim permitimos molduras de
at´e 64KB
Fonte: [1]
Por isso o uso de $fp ´e opcional
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 19 / 40
56. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Mas mesmo que se acesse
todo o espa¸co, h´a o problema
do $sp ser m´ovel
Ele pode variar durante o
procedimento, mudando sua
distˆancia aos elementos na pilha
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 20 / 40
57. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Mas mesmo que se acesse
todo o espa¸co, h´a o problema
do $sp ser m´ovel
Ele pode variar durante o
procedimento, mudando sua
distˆancia aos elementos na pilha
$fp fornece ent˜ao uma base
est´avel para referˆencias locais
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 20 / 40
58. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Podemos, no entanto, evitar
us´a-lo evitando mudan¸cas no
$sp dentro da rotina
Ajustando-o somente na entrada
e sa´ıda da rotina
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 21 / 40
59. Programando em MIPS
Pilha de Execu¸c˜ao – Moldura de Pilha
Podemos, no entanto, evitar
us´a-lo evitando mudan¸cas no
$sp dentro da rotina
Ajustando-o somente na entrada
e sa´ıda da rotina
Quando usarmos, devemos
inicializ´a-lo com o $sp no
in´ıcio da chamada
Fonte: [1]
Assim, ao fim da chamada, restauramos $sp usando o $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 21 / 40
60. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
O que armazenar na pilha?
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 22 / 40
61. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
O que armazenar na pilha?
Imediatamente antes da
chamada `a sub-rotina:
Registradores $a0 - $a3 e $t0 -
$t9 que a rotina possa precisar
ap´os a invoca¸c˜ao da sub-rotina
Parˆametros-extra (para al´em dos
4 registradores)
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 22 / 40
62. Programando em MIPS
Sub-rotinas – Pilha de Execu¸c˜ao
Assim que a sub-rotina inicia:
$fp e $ra (da rotina que a
chamou)
Registradores $s0 – $s7 antes de
modific´a-los, para restaur´a-los
depois
Vari´aveis locais
Fonte: [1]
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 23 / 40
63. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 1
Considere a fun¸c˜ao
int g(int x, int y) {
return(x + y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 24 / 40
64. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 1
Considere a fun¸c˜ao
Ela n˜ao chama outra
fun¸c˜ao nem possui
vari´aveis locais
N˜ao precisa salvar $ra,
pois ningu´em ir´a
sobrescrever
int g(int x, int y) {
return(x + y);
}
Sequer precisa de moldura na pilha, pois n˜ao h´a o que salvar
nela
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 24 / 40
65. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 1
Considere a fun¸c˜ao
Ela n˜ao chama outra
fun¸c˜ao nem possui
vari´aveis locais
N˜ao precisa salvar $ra,
pois ningu´em ir´a
sobrescrever
int g(int x, int y) {
return(x + y);
}
g: add $v0, $a0, $a1
jr $ra
Sequer precisa de moldura na pilha, pois n˜ao h´a o que salvar
nela
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 24 / 40
66. Programando em MIPS
Pilha de Execu¸c˜ao
Rotinas que n˜ao
chamam outras rotinas
s˜ao denominadas de
rotinas-folha
int g(int x, int y) {
return(x + y);
}
g: add $v0, $a0, $a1
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 25 / 40
67. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Considere agora essa
outra rotina-folha
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 26 / 40
68. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Considere agora essa
outra rotina-folha
Dessa vez, com 1 vari´avel
local
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 26 / 40
69. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Considere agora essa
outra rotina-folha
Dessa vez, com 1 vari´avel
local
Os 4 parˆametros foram
passados em $a0 – $a3
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 26 / 40
70. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
71. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Associaremos f a $s0
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
72. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Por ser um registrador salvo, preci-
samos preservar seu valor anterior
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
73. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Reservamos ent˜ao
espa¸co para $s0 na pilha
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
74. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Fazemos isso deslo-
cando o topo da pilha
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
75. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
E armazenando $s0 l´a
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
76. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Prosseguimos nos c´alculos
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
77. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Prosseguimos nos c´alculos
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
78. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Prosseguimos nos c´alculos
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
79. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Note que n˜ao preservamos $t0 e $t1
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
80. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Isso porque, pela conven¸c˜ao, estes
n˜ao precisam ser preservados
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
81. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Armazenamos a resposta
no registrador de retorno
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
82. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Restauramos o valor antigo de $s0
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
83. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Restauramos o topo da pilha
(desempilhamos a moldura de X)
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
84. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Voltamos `a instru¸c˜ao pos-
terior `a chamada de X
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
85. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
Uma vez que $sp permaneceu
est´atico (ap´os sua modifica¸c˜ao
inicial), n˜ao precisamos do $fp
int X(int g, int h, int i,
int j) {
int f;
f = (g+h) - (i+j);
return(f);
}
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 27 / 40
86. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
87. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Por¸c˜ao da pilha usada
pela rotina atual-
mente em execu¸c˜ao
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
88. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Por¸c˜ao livre da pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
89. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Palavra de mem´oria
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
90. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
91. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
92. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
93. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
94. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
95. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
96. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
97. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
98. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
99. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
100. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 2
X:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
. . .
. . .
. . .
$s0
$sp
Ao final da sub-rotina,
a pilha foi devolvida
ao seu estado inicial
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 28 / 40
101. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Vejamos um programa
completo
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 29 / 40
102. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Vejamos um programa
completo
Com uma rotina-folha
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 29 / 40
103. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Vejamos um programa
completo
Com uma rotina-folha
E outra n˜ao folha
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 29 / 40
104. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int main(void) {
int x=3;
x = x + m(2, x);
}
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
105. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
106. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Associamos x a $s0
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
107. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Carregamos os parˆametros
nos registradores $a0 e $a1
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
108. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Carregamos os parˆametros
nos registradores $a0 e $a1
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
109. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Chamamos a sub-rotina. Nesse
momento, $ra = pc + 4 (o
endere¸co de add $s0...)
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
110. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Somamos o retorno da sub-
rotina (em $v0) a x, arma-
zenando o resultado em x
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
111. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Desviamos para o fim do programa
int main(void) {
int x=3;
x = x + m(2, x);
}
.text
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
...
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 30 / 40
112. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
113. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Os parˆametros est˜ao em $a0 e $a1
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
114. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Usaremos $s0 para y, ent˜ao
alocamos espa¸co na pilha
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
115. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
E persistimos o valor de $s0 l´a
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
116. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
117. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Lembre que $v0 conter´a o va-
lor de retorno da sub-rotina
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
118. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Terminada a sub-
rotina, restauramos $s0
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
119. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
E liberamos o espa¸co na pilha
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
120. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
Retornando `a chamada da sub-rotina
int m(int a, int b) {
int y;
y = a*b;
return(y);
}
...
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 31 / 40
121. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
122. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
123. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Inicialmente, $sp est´a
no endere¸co mais alto
poss´ıvel ao programa
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
124. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
125. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
126. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
127. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
128. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
129. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
130. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
131. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
132. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
133. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
134. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
$ra cont´em o endere¸co da
instru¸c˜ao seguinte ao jal
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
135. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
136. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
137. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 3
main:
li $s0, 3
li $a0, 2
move $a1, $s0
jal m
add $s0, $s0, $v0
j fim
m:
addi $sp, $sp -4
sw $s0, 0($sp)
mul $s0, $a0, $a1
move $v0, $s0
lw $s0, 0($sp)
addi $sp, $sp 4
jr $ra
fim:
. . .
$s0 = 3
$sp
Novamente o uso do
$fp n˜ao foi necess´ario
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 32 / 40
138. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E agora o terror do uso da pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 33 / 40
139. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E agora o terror do uso da pilha
A recurs˜ao
int fat(int n) {
if (n<2) return(1);
return (n * fat(n-1));
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 33 / 40
140. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
141. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
142. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
n ´e passado em $a0
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
143. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Cada chamada recur-
siva tamb´em usar´a $a0
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
144. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Al´em de $ra, para seu retorno
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
145. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
146. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
147. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
148. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Precisamos ent˜ao preser-
var na pilha esses valores
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
149. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
150. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
151. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Se n<2, o valor de retorno ´e 1
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
152. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Antes de retornar,
restauramos a pilha
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
153. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Como nada foi mudado, n˜ao
precisamos restaurar $a0 e $ra
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
154. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
155. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Se n≥2, prosseguimos em L1
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
156. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Preparamos o parˆametro da
pr´oxima chamada recursiva
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
157. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E fazemos a chamada
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
158. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Ao retornar, precisa-
mos fazer $v0 * $a0
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
159. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Mas $a0 foi modifi-
cado pelas chamadas
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
160. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Ent˜ao temos que restaur´a-lo
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
161. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Ent˜ao temos que restaur´a-lo
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
162. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Aproveitamos para restaurar
o endere¸co de retorno tamb´em
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
163. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Al´em da pilha
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
164. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
Preparamos o resultado
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
165. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4
E retornamos
int fat(int n) {
if (n<2) return(1);
return(n * fat(n-1));
}
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 34 / 40
166. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
167. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .$sp
Temos que $a0
= 3 (fat(3))
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
168. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
169. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
170. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
171. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
$t0 = 0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
172. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
$t0 = 0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
173. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
$a0 = 2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
174. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
175. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
176. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$ra = end2
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
177. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$ra = end2
$a0 = 2$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
199. Programando em MIPS
Pilha de Execu¸c˜ao – Exemplo 4 (fat(3))
fat:
addi $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)
slti $t0, $a0, 2
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra
L1:
addi $a0, $a0, -1
jal fat
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
mul $v0, $v0, $a0
jr $ra
. . .
$ra = end1
$a0 = 3
$ra = end2
$a0 = 2
$ra = end3
$a0 = 1
$sp
Retorna a end1
(a rotina que cha-
mou inicialmente)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
200. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
At´e 4 parˆametros usamos os registradores $a0-$a3
Precisando de mais, usamos a pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 36 / 40
201. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
At´e 4 parˆametros usamos os registradores $a0-$a3
Precisando de mais, usamos a pilha
Mas onde colocar na pilha?
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 36 / 40
202. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
At´e 4 parˆametros usamos os registradores $a0-$a3
Precisando de mais, usamos a pilha
Mas onde colocar na pilha?
Imediatamente acima do $fp para a nova sub-rotina
Assim, ela poder´a acess´a-los via o $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 36 / 40
203. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
204. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
. . .
arg6
arg5$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
205. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5$sp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
206. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5
$sp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
207. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5
$sp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Definindo, por fim, seu $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
208. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Antes de chamar a
sub-rotina a rotina
empilha os argumentos
E ent˜ao chama a
sub-rotina, que define
seu $sp
. . .
arg6
arg5
$sp
$fp
Criando espa¸co para o que for modificar ($fp, $ra etc.)
Definindo, por fim, seu $fp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 37 / 40
209. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
. . .$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
210. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
. . .
arg6
arg5$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
211. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
Esta ´e uma das situa¸c˜oes
em que ajuda ter um $fp,
para evitarmos ter que
rever o endere¸co de cada
elemento na pilha para a
rotina
. . .
arg6
arg5$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
212. Programando em MIPS
Pilha de Execu¸c˜ao – Mais Parˆametros
Note que o $sp da
rotina original mudou
Esta ´e uma das situa¸c˜oes
em que ajuda ter um $fp,
para evitarmos ter que
rever o endere¸co de cada
elemento na pilha para a
rotina
. . .
arg6
arg5$sp
E ´e por isso que definimos o $fp ap´os o $sp
Para podermos guardar o $fp da rotina anterior na pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 38 / 40
213. Referˆencias
1 Patterson, D.A.; Hennessy, J.L. (2013): Computer Organization and
Design: The Hardware/Software Interface. Morgan Kaufmann. 5a
ed.
Para detalhes sobre MIPS consulte tamb´em o Apˆendice A
2 https://www.embarcados.com.br/arquitetura-de-conjunto-
de-instrucoes-mips/
Curso bastante completo, em portuguˆes
3 https://sites.cs.ucsb.edu/~franklin/64/lectures/
mipsassemblytutorial.pdf
Tutorial mais profundo
4 https://youtu.be/y9Wv1RVbbNA
Funcionamento geral da pilha de execu¸c˜ao
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 39 / 40