2016-01-12 30 views
0

所以我的jal操作员看起来并不像做它应该做的事情。它看起来就是节省了4个地址,而不是它想要的。我的测试代码是:为什么我的JAL从PC获得+4以上的应该?

.data 

test: .asciiz "test" 
test1: .asciiz "test1" 
test2: .asciiz "test2" 
.text 
main: 
la $a0, test 
li $v0, 4 
syscall 
li $t9, 5 # messing with line before jal 
jal next 
li $v0, 10 
syscall 
# it should never hit this code 
la $a0, test1 
li $v0, 4 
syscall 
next: 
la $a0, test2 
li $v0, 4 
syscall 
jr $ra 
li $a0, 1 # it should never hit this code 
li $v0, 1 
syscall 

输出结果为:“执行:执行因错误而终止”。代码并不重要,它只是假设用jal显示问题,有谁知道如何修复pc或jal? (我已经重新安装了mars和java。)
printscreenofjal

回答

1

这听起来像你在火星的设置中启用了延迟分支。

如果采取MIPS32™架构来看看JAL说明对于程序员 第二卷:将MIPS32™指令集你会看到什么你所描述的实际上是正确的和预期的行为:

放置在GPR 31的返回链路返回地址链接的第二指令的分支, 在哪个过程调用后的位置继续执行之后的地址。

这是因为MIPS处理器使用延迟分支,这会导致在执行继续执行分支目标之前紧接着执行分支指令的指令。作为程序员,这意味着您必须注意填写分支延迟插槽,可以通过在所有分支指令之后插入NOP或重新组织代码来完成。

注意,延迟转移默认情况下禁用,如果我在火星延迟转移禁用我得到以下输出运行程序:

testtest2 
-- program is finished running -- 
+0

谢谢你,这个工作。直到你提到它,我才知道这是一种选择。我也认为重新安装它会重置默认值。尽管现在工作。 – Joseph

相关问题