SlideShare uma empresa Scribd logo
1 de 214
Baixar para ler offline
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
Programando em MIPS
Condicionais
Existem 2 condicionais em MIPS
Ambos do tipo I (immediate)
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 2 / 40
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
$t0 = 0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$t0 = 0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$a0 = 1
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
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
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
$sp
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$t0 = 1
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$t0 = 1
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$v0 = 1
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
Restaura a pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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 end3
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
Restaura $a0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
E $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
Restaura a pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$v0 = 2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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 end2
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
Restaura $a0
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
E $ra
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
Restaura a pilha
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
$v0 = 6
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Referˆencias
5 https://courses.cs.washington.edu/courses/cse410/09sp/
examples/MIPSCallingConventionsSummary.pdf
Exemplos de funcionamento da pilha de execu¸c˜ao
Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 40 / 40

Mais conteúdo relacionado

Mais de Norton Trevisan Roman

(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03Norton Trevisan Roman
 
(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21Norton Trevisan Roman
 
(ACH2001) Introdução à Programação - Aula 20
(ACH2001) Introdução à Programação - Aula 20(ACH2001) Introdução à Programação - Aula 20
(ACH2001) Introdução à Programação - Aula 20Norton Trevisan Roman
 

Mais de Norton Trevisan Roman (20)

(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17(ACH2044) Inteligência Artificial - Aula 17
(ACH2044) Inteligência Artificial - Aula 17
 
(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16(ACH2044) Inteligência Artificial - Aula 16
(ACH2044) Inteligência Artificial - Aula 16
 
(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15(ACH2044) Inteligência Artificial - Aula 15
(ACH2044) Inteligência Artificial - Aula 15
 
(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14(ACH2044) Inteligência Artificial - Aula 14
(ACH2044) Inteligência Artificial - Aula 14
 
(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13(ACH2044) Inteligência Artificial - Aula 13
(ACH2044) Inteligência Artificial - Aula 13
 
(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12(ACH2044) Inteligência Artificial - Aula 12
(ACH2044) Inteligência Artificial - Aula 12
 
(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11(ACH2044) Inteligência Artificial - Aula 11
(ACH2044) Inteligência Artificial - Aula 11
 
(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10(ACH2044) Inteligência Artificial - Aula 10
(ACH2044) Inteligência Artificial - Aula 10
 
(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09(ACH2044) Inteligência Artificial - Aula 09
(ACH2044) Inteligência Artificial - Aula 09
 
(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08(ACH2044) Inteligência Artificial - Aula 08
(ACH2044) Inteligência Artificial - Aula 08
 
(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07(ACH2044) Inteligência Artificial - Aula 07
(ACH2044) Inteligência Artificial - Aula 07
 
(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06(ACH2044) Inteligência Artificial - Aula 06
(ACH2044) Inteligência Artificial - Aula 06
 
(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05(ACH2044) Inteligência Artificial - Aula 05
(ACH2044) Inteligência Artificial - Aula 05
 
(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04(ACH2044) Inteligência Artificial - Aula 04
(ACH2044) Inteligência Artificial - Aula 04
 
(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03(ACH2044) Inteligência Artificial - Aula 03
(ACH2044) Inteligência Artificial - Aula 03
 
(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02(ACH2044) Inteligência Artificial - Aula 02
(ACH2044) Inteligência Artificial - Aula 02
 
(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23(ACH2001) Introdução à Programação - Aula 23
(ACH2001) Introdução à Programação - Aula 23
 
(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22(ACH2001) Introdução à Programação - Aula 22
(ACH2001) Introdução à Programação - Aula 22
 
(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21(ACH2001) Introdução à Programação - Aula 21
(ACH2001) Introdução à Programação - Aula 21
 
(ACH2001) Introdução à Programação - Aula 20
(ACH2001) Introdução à Programação - Aula 20(ACH2001) Introdução à Programação - Aula 20
(ACH2001) Introdução à Programação - Aula 20
 

Último

Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfTutor de matemática Ícaro
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasrfmbrandao
 
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...MariaCristinaSouzaLe1
 
Historia de Portugal - Quarto Ano - 2024
Historia de Portugal - Quarto Ano - 2024Historia de Portugal - Quarto Ano - 2024
Historia de Portugal - Quarto Ano - 2024Cabiamar
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022LeandroSilva126216
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdfmarlene54545
 
Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...
Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...
Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...AnaAugustaLagesZuqui
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxJustinoTeixeira1
 
INTERTEXTUALIDADE atividade muito boa para
INTERTEXTUALIDADE   atividade muito boa paraINTERTEXTUALIDADE   atividade muito boa para
INTERTEXTUALIDADE atividade muito boa paraAndreaPassosMascaren
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfAutonoma
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024azulassessoria9
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...azulassessoria9
 
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...marcelafinkler
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º anoRachel Facundo
 
O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.denisecompasso2
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptssuser2b53fe
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...SileideDaSilvaNascim
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaCentro Jacques Delors
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxMarcosLemes28
 

Último (20)

Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturas
 
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
 
Historia de Portugal - Quarto Ano - 2024
Historia de Portugal - Quarto Ano - 2024Historia de Portugal - Quarto Ano - 2024
Historia de Portugal - Quarto Ano - 2024
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022
 
19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf19- Pedagogia (60 mapas mentais) - Amostra.pdf
19- Pedagogia (60 mapas mentais) - Amostra.pdf
 
Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...
Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...
Tema de redação - As dificuldades para barrar o casamento infantil no Brasil ...
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptx
 
INTERTEXTUALIDADE atividade muito boa para
INTERTEXTUALIDADE   atividade muito boa paraINTERTEXTUALIDADE   atividade muito boa para
INTERTEXTUALIDADE atividade muito boa para
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
 
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
 
Camadas da terra -Litosfera conteúdo 6º ano
Camadas da terra -Litosfera  conteúdo 6º anoCamadas da terra -Litosfera  conteúdo 6º ano
Camadas da terra -Litosfera conteúdo 6º ano
 
Novena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João EudesNovena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João Eudes
 
O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.O que é arte. Definição de arte. História da arte.
O que é arte. Definição de arte. História da arte.
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...apostila filosofia 1 ano  1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
apostila filosofia 1 ano 1s (1).pdf 1 ANO DO ENSINO MEDIO . CONCEITOSE CARAC...
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União Europeia
 
Cartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptxCartão de crédito e fatura do cartão.pptx
Cartão de crédito e fatura do cartão.pptx
 

(ACH2055) Arquitetura de Computadores - Aula 04

  • 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
  • 2. Programando em MIPS Condicionais Existem 2 condicionais em MIPS Ambos do tipo I (immediate) Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 2 / 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
  • 178. 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 $t0 = 0 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 179. 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 $t0 = 0 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 180. 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 $a0 = 1 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 181. 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
  • 182. 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
  • 183. 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 $sp Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 184. 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 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 185. 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 $t0 = 1 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 186. 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 $t0 = 1 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 187. 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 $v0 = 1 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 188. 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 Restaura a pilha Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 189. 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 end3 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 190. 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 Restaura $a0 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 191. 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 E $ra Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 192. 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 Restaura a pilha Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 193. 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 $v0 = 2 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 194. 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 end2 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 195. 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 Restaura $a0 Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 196. 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 E $ra Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 197. 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 Restaura a pilha Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 35 / 40
  • 198. 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 $v0 = 6 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
  • 214. Referˆencias 5 https://courses.cs.washington.edu/courses/cse410/09sp/ examples/MIPSCallingConventionsSummary.pdf Exemplos de funcionamento da pilha de execu¸c˜ao Norton Trevisan Roman (norton@usp.br) 1 de novembro de 2019 40 / 40