我遇到了指令jalr $t1, $t2
指令,它应该将 $t1 设置为返回地址并跳转到 $t2。然而,关于哪个操作首先发生似乎有些模糊。例如,以下在 MARS 和 SPIM 中的工作方式不同:
.text
main:
la $t0, func
jalr $t0, $t0
# ...
li $v0, 10
syscall # Exit program
func:
# ...
jr $t0
在 MARS 中,$t0
首先设置为pc + 4
(返回地址),然后跳转到$t0
,这样下面的代码func
就永远不会运行。然而,SPIM 似乎做了相反的事情:先跳转,然后将 value 设置$t0
为 (the previous) pc + 4
;因此func
被调用并照常运行。
因此,我的问题是,在这种情况下哪个模拟器实现了正确的行为?