MIPS-programma JR $ RA-instructies en stapelafhandeling

Ik ben nieuw voor het programmeren van MIPS en worstelen om het MIPS-programma te begrijpen en hoe stroomt het. Kan iemand me alsjeblieft helpen het te begrijpen. Hieronder is de code.
Mijn twijfel is in RTNfunctie waarbij $rawordt geretourneerd wanneer de uitvoering moet terugkeren na jr $rA en wat wordt opgeslagen na sw $ra, 8($sp)om te stapelen, want wanneer deze verklaring eerst wordt uitgevoerd wat de waarde is van $ra? Is het wat vuilniswaarde of we moeten een waarde aannemen om het programma te begrijpen?

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

Antwoord 1, Autoriteit 100%

Op functie-invoer, rahoudt het retouradres vast waar onze beller wil dat we springen als we klaar zijn.

De functie Preambule slaat het op aan de stapel omdat de functie Body jalgebruikt om functie-oproepen te maken. jalOverschrijft raDus we moeten ons eigen retouradres omronden / herstellen.

f: addi $sp, $sp, -12    ; adjust stack pointer to accommodate stack frame (subtract 12 bytes)
sw $ra, 8($sp)           ; save a copy of our return address
...

Wanneer de functie is voltooid, kunnen we de dingen die we hebben opgeslagen herstellen en vervolgens de standaard jr $ragebruiken om terug te keren, pc = $ RA.

...
lw $ra, 8($sp)           ; restore saved return address
addi $sp, $sp, 12        ; restore stack pointer (dispose of stack frame)
jr $ra                   ; jump to return address

(Sommige frasing- en codevorming gekopieerd van @ Paulr’s antwoord dat het niet goed lijkt te verklaren, dus ik voelde dat al zijn tekst een herschrijf nodig heeft buiten de codeblokken.)

Other episodes