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 RTN
functie waarbij $ra
wordt geretourneerd wanneer de uitvoering moet terugkeren na jr $r
A 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, ra
houdt 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 jal
gebruikt om functie-oproepen te maken. jal
Overschrijft ra
Dus 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 $ra
gebruiken 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.)