MIPS条件语句BNE始终是分支

时间:2014-09-14 22:59:59

标签: string loops assembly mips

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语句并执行它下面的语句。我猜我的推理不正确。

1 个答案:

答案 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机器,否则您的代码将无效。