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

Rei*_*nCL 14 mips program-counter

我无法理解指令jal在MIPS处理器中的工作原理.我的两个问题是:
a)在"jal"之后存储在R31中的值是什么:PC + 4PC + 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"

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

Ric*_*ton 16

$ ra中的地址实际上是PC + 8.紧跟在jal指令之后的指令在" 分支延迟槽 "中.它在函数输入之前执行,因此在函数返回时不应重新执行.

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

延迟槽用于在执行jal指令所花费的时间内做一些有用的事情.