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

标签 assembly mips mips64

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

相关文章:

c++ - C/C++ 在幕后按值返回结构

gcc - "Hacking: The Art of Exploitation"- 书籍示例与我系统的 gcc 中的程序集不一致

assembly - 汇编指令 `.global`的作用是什么

java - Mars MIPS 模拟器无法运行,安装有问题吗?

linux - 在 MIPS TLB 中,除了 ASID 字段之外,两个条目是否可能相同?

c++ - MOV EAX, DWORD PTR SS :[EBP+8h] and how can I translate it into AT&T format? 是什么意思

c++ - 如何在没有硬件抽象层的情况下直接访问x64硬件?

c++ - MIPS : loop goes to infinity

assembly - 了解 `lw` 和 `sw` 在 MIPS 程序中的实际工作方式