Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MIPS-JAL混淆:$ra=PC+;4或PC+;8._Mips_Program Counter - Fatal编程技术网

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

MIPS-JAL混淆:$ra=PC+;4或PC+;8.,mips,program-counter,Mips,Program Counter,我无法理解jal指令在MIPS处理器中是如何工作的。 我的两个问题是: a)在“日航”之后,R31中存储的值是什么:PC+4或PC+8? b)如果它真的是PC+8,那么PC+4的指令会发生什么变化?它是在跳转之前执行的还是从未执行过 帕特森与轩尼诗(第四版),第113页: “跳转和链接指令:跳转到和地址并同时将以下指令的地址保存在寄存器中的指令($ra,在MIPS中)” “程序计数器(PC):包含正在执行的程序中指令地址的寄存器” 在阅读了这两条语句之后,保存在$ra中的值应该是(PC+4) 但

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

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

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

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

在阅读了这两条语句之后,保存在$ra中的值应该是(PC+4

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

这也表明“它确实是PC+8
”,但奇怪的是,在这之后它说,由于管道是一个高级主题,“我们将假设返回地址是PC+4”

我来自8086汇编,所以我知道返回一个地址和它后面的地址之间有很大的区别,因为如果我只是假设某个地址不正确,程序将无法工作。谢谢。

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

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


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

我也有同样的问题。谷歌搜索了Richard的这个极好的答案,我想在这里添加另一个链接

链接是 有了这个奇妙的解释,双加4的个人电脑。
因此,实际执行有两个附加值:1)通过管道传输的newPC=PC+4和2)通过jal指令的另一个附加值$ra=newPC+4,产生有效的$ra=(jal指令的地址)+8。

非常感谢!奇怪的是,许多网站提供了错误的信息(PC+4)。