MIPS - JAL混淆:$ ra = PC + 4或PC + 8?

时间:2012-03-03 18:57:09

标签: mips program-counter

我无法理解指令 jal 在MIPS处理器中的工作原理。 我的两个问题是:
a)“jal”之后 R31 中存储的值是多少: PC + 4 PC + 8
b)如果它真的 PC + 8 ,那么 PC + 4 的指令会发生什么?它是在跳转之前执行还是从未执行过?

在Patterson和Hennessy(第四版),第113页:

“跳转和链接指令:跳转到并寻址并同时将以下指令的地址保存在寄存器中的指令(MIPS中的 $ ra )”

“程序计数器( PC ):包含正在执行的程序中指令地址的寄存器”

在阅读这两个陈述之后, $ ra 中保存的值应为( PC + 4 )。

但是,在本书附带的MIPS参考数据(绿卡)中,jal指令的算法定义如下:
“跳转和链接:jal:J:R [31] = PC + 8; PC = JumpAddr”

website还声明“它真的 PC + 8 ”,但奇怪的是,之后它说由于流水线操作是一个高级主题“我们假设返回地址是的 PC + 4 ”。
我来自8086汇编,所以我知道返回地址和跟随地址之间存在很大差异,因为如果我假设某些事情并非如此,那么程序将无法工作。感谢。

2 个答案:

答案 0 :(得分:14)

$ ra中的地址实际上是PC + 8。紧接jal指令后的指令位于“branch delay slot”中。它在函数输入之前执行,因此在函数返回时不应重新执行。

Mips上的其他分支指令也有分支延迟时隙。

延迟槽用于执行jal指令所需的时间。

答案 1 :(得分:1)

我有同样的问题。用Google搜索了理查德的这个优秀答案以及我希望在此处添加的另一个链接。

链接为http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html 通过这个精彩的解释,将PC加倍4。 所以实际执行有两个补充:1)newPC = PC + 4通过流水线操作和2)另一个加法$ ra = newPC + 4由jal指令产生有效$ ra =(jal指令的地址)+8。