loop:
lb $t0 0($a0)
beqz $t0 done
bne $t0 $a1 continue
sb $a2 0($a0)
continue:
addi $a0 $a0 1
j loop
这个循环只是越过一个字符串,除了我无法弄清楚为什么语句bne $t0 $a1 continue
仍然分支,即使我在xspim
登记并且它们是相等的。
基本上,$t0 == $a1
时程序不应该分支。 $a1
是' '
字符,然后它应移到语句sb $a2 0($a0)
上。所以我在xpsim
和$t0 = 20
(在十六进制中,所以ASCII代码是' '
)中踩到了,所以这应该等于$a0
,这也是{{1} }}。
因此,它不应该分支到continue语句并执行它下面的语句。我猜我的推理不正确。
答案 0 :(得分:1)
奇怪。我写了一个SPIM程序来测试这个:
.data
str: .asciiz "test test test"
.text
main:
la $a0, str
addi $a1, $zero, 32
addi $a2, $zero, 64
loop:
lb $t0, 0($a0)
beq $t0, $zero, done
bne $t0, $a1, continue
sb $a2, 0($a0)
continue:
addi $a0, $a0, 1
b loop
done:
addi $v0, 4
la $a0, str
syscall
addi $v0, $zero, 10
syscall
并按预期返回“test@test@test
”。请注意,在“真正的”MIPS中,有些事情可能会让您感到意外:
1.分支有一个分支延迟槽,分支执行后的指令无论分支是否被采用
2.分支不能位于另一个分支的分支延迟槽中
确保您没有设置SPIM来模拟原始MIPS机器,否则您的代码将无效。