$ra返回当前指令的地址还是下一条指令的地址?

4
我对 $ra 返回地址的概念非常困惑。它返回正在执行的指令地址还是将要执行的下一条指令地址?请使用以下代码进行解释:
考虑一个调用三个函数 func_A、func_B 和 func_C 的代码片段。指令 1 位于地址 1996。当每个函数被调用时,寄存器 $ra 中加载的内容分别为什么?
Instruction 1
Instruction 2
jal func_A
Instruction 3
jal func_B
Instruction 4
jal func_C
Instruction 5

感谢您提前阅读。

2
我不记得MIPS架构,但逻辑上讲返回地址应该是下一个要执行的指令,否则你会陷入无限循环。 - Itsik
1个回答

9

下一条指令存储在$ra中。

因此,在调用函数A时,$ra = 2008;在调用函数B时,$ra = 2016;在调用函数C时,$ra = 2024。

这是合乎逻辑的,因为你通过jr $ra从子程序返回,从而跳转到子程序调用后的指令。


在每个JAL之后,你忘记了MIPS分支延迟槽。第3条指令在func_A开始之前被执行,所以$ra将包含“jal func_B”的地址,即在func_A开始时为2012。同样,当调用$func_B时,$ra包含2020,调用func_C时则为2028。 - markgz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接