2012-03-03 315 views
11

我无法理解指令jal如何在MIPS处理器中工作。 我的两个问题是:
一)什么是R31存储在“日航” 后的值:PC + 4PC + 8
B)如果它真的PC + 8,会发生什么变化指令在PC + 4?是在跳跃之前执行还是从未执行?

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

“跳和链接指令:跳转到和地址,并同时在寄存器(保存下一条指令的地址$的指令岭在MIPS)”

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

读取这两个语句之后,可以得出的值SA ved in $ ra应该是(PC + 4)。

然而,在随附书MIPS基准数据(绿色卡),JAL指令的算法被定义如下:
“跳转和链接:JAL:J-:R t [31] = PC + 8 ; PC = JumpAddr“

website还指出,‘这是真的PC + 8’,但奇怪的是,在那之后它说,由于流水线是一种先进的主题”我们假设返回地址PC +4“。
我来自8086程序集,所以我意识到回到一个地址和跟在它后面的地址之间有很大的区别,因为如果我假设某些事情不是真的,那么程序将不起作用。谢谢。

回答

12

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

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

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

+0

非常感谢!奇怪的是,许多网站提供了错误的信息(PC + 4)。 – ReimannCL 2012-03-03 20:50:33

1

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

链接是http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html 与这个美妙的解释双加4到PC。因此,实际执行有两个增加:1)通过流水线操作newPC = PC + 4,以及2)通过jal指令产生另一个额外的$ ra = newPC + 4,从而产生有效的$ ra =(jal指令的地址)+8。