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
Author: Paul R, 2015-09-23

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