Instruções do programa MIPS jr $ra e tratamento da pilha
Sou novo na programação MIPS e tenho lutado para entender o programa MIPS e como ele flui. Alguém me pode ajudar a entender isso? Abaixo está o código.
A minha dúvida está na função
RTN
onde $ra
é devolvida onde a execução deverá regressar depois de jr $r
a e o que será armazenado depois de sw $ra, 8($sp)
para empilhar, porque quando esta declaração executar pela primeira vez qual será o valor de $ra
? É algum valor de lixo ou precisamos assumir algum valor a fim de entender o programa?
f: addi $sp, $sp, -12
sw $ra, 8($sp)
sw $s0, 4($sp)
sw $a0, 0($sp)
bgt $a0, $0, L1
add $v0, $0, $0
j RTN
L1: addi $t0, $0, 1
bne $t0, $a0, L2
add $v0, $0, $t0
j RTN
L2: subi $a0, $a0,1
jal f
add $s0, $v0, $0
sub $a0, $a0,1
jal f
add $v0, $v0, $s0
RTN: lw $a0, 0($sp)
lw $s0, 4($sp)
lw $ra, 8($sp)
addi $sp, $sp, 12
jr $ra
0
1 answers
O endereço de retorno é gravado em ra
no preâmbulo da função:
f: addi $sp, $sp, -12 ; adjust stack pointer to accommodate stack frame (subtract 12 bytes)
sw $ra, 8($sp) ; save return address in ra
...
Então, quando a função estiver completa, pode apenas restaurar o ponteiro da pilha para se livrar da moldura da pilha e, em seguida, saltar para o endereço de retorno gravado em ra
:
...
addi $sp, $sp, 12 ; restore stack pointer (dispose of stack frame)
jr $ra ; jump to saved return address
0
Author: Paul R, 2015-09-23 08:43:44