所以我的jal运算符看起来并不像它所做的那样。看起来它可以节省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
输出为:“Go:执行因错误而终止。”代码并不重要,它只是假设用jal显示问题,有没有人知道如何修复pc或jal? (我重新安装了火星和爪哇。)
printscreenofjal
答案 0 :(得分:1)
听起来像你在火星上已经启用延迟分支'设置。
如果您查看 MIPS32™架构程序员中JAL
的说明
第二卷:MIPS32™指令集您将看到您所描述的内容实际上是正确的和预期的行为:
将返回地址链接放在GPR 31中。返回链接是分支后面的第二条指令的地址, 在程序调用后继续执行该位置。
这是因为MIPS处理器使用延迟分支,这导致紧跟分支指令之后的指令在分支目标继续执行之前执行。作为程序员,这意味着您必须通过在所有分支指令之后插入NOP或重新组织代码来处理填充分支延迟槽。
请注意,默认情况下会禁用延迟分支,如果我在Mars中运行程序并禁用延迟分支,则会得到以下输出:
testtest2
-- program is finished running --