我是 MIPS 编程的新手,一直在努力理解 MIPS 程序及其流程。谁能帮我理解它。下面是代码。
我的疑问在于 RTN
$ra
的函数在 jr $r
之后执行应该返回的地方返回a 以及在 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
最佳答案
在函数输入时,ra
保存完成后调用者希望我们跳转的返回地址。
函数前导码将其保存到堆栈中,因为函数体使用 jal
进行函数调用。 jal
覆盖 ra
所以我们需要保存/恢复我们自己的退货地址。
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
...
功能完成后我们可以恢复我们保存的东西,然后使用标准
jr $ra
返回,设置 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
(从@PaulR 的答案复制的一些措辞和代码格式似乎解释不正确,所以我觉得它的所有文本都需要在代码块之外重写。)
关于assembly - MIPS 程序 jr $ra 指令和堆栈处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32733272/