我是MIPS编程的新手,一直在努力理解MIPS程序和它是如何流动的。有人能帮助我理解它吗?下面是代码。我的怀疑是在RTN
函数中,其中返回$ra
,执行应该在jr $ra
之后返回,并且在sw $ra, 8($sp)
之后将存储到堆栈的内容,因为当此语句第一次执行时,$ra
的值?它是某个垃圾值还是我们需要假设某个值才能理解程序?
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
1条答案
按热度按时间ejk8hzay1#
在函数入口处,
ra
保存了调用者希望我们在完成后跳转到的返回地址。因为函数体使用
jal
来进行函数调用,所以函数前导将其保存到堆栈中。jal
覆盖了ra
,因此我们需要保存/恢复我们自己的返回地址。当函数完成后,我们可以恢复保存的内容,然后使用标准的
jr $ra
返回,设置PC = $ra。(Some从@PaulR的答案中复制的措辞和代码格式似乎解释不正确,因此我觉得代码块之外的所有文本都需要重写。)