17

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

在帕特森和轩尼诗(第四版),第 113 页:

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

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

读完这两条语句后,$ra中保存的值应该是(PC+4)。

但是在随书附带的MIPS参考资料(绿卡)中,jal指令的算法是这样定义的:
“Jump and Link : jal : J : R[31]=PC+8;PC=JumpAddr”

网站还声明“它实际上是PC+8 ”,但奇怪的是,之后它说由于流水线是一个高级主题,“我们假设返回地址是PC+4 ”。
我来自 8086 程序集,所以我知道返回地址和返回地址后面的地址之间存在很大差异,因为如果我只是假设某些不正确的东西,程序将无法运行。谢谢。

4

2 回答 2

19

$ra 中的地址实际上是 PC+8。紧跟在 jal 指令之后的指令位于“分支延迟槽”中。它在函数进入之前执行,所以在函数返回时不应该重新执行。

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

延迟槽用于在执行 jal 指令时做一些有用的事情。

于 2012-03-03T19:08:23.553 回答
1

我也有同样的问题。谷歌搜索了理查德这个出色的答案以及我希望在此处添加的另一个链接。

链接是http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html ,其中包含对 PC 的双加 4 的精彩解释。所以实际执行有两个加法:1)newPC=PC+4 通过流水线和 2)另一个加法 $ra=newPC+4 通过 jal 指令导致有效的 $ra =(jal 指令的地址)+8。

于 2014-01-19T12:38:10.060 回答