assembly MIPS程序jr $ra指令和堆栈处理

0g0grzrc  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(272)

我是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
ejk8hzay

ejk8hzay1#

在函数入口处,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

(Some从@PaulR的答案中复制的措辞和代码格式似乎解释不正确,因此我觉得代码块之外的所有文本都需要重写。)

相关问题