在讲座中,我们的教授说,在分支中使用bne
而不是使用beq
(并让我们弄清楚),有一个原因,如下图所示。
if ( i == j )
i++ ;
j-- ;
编译为
bne $r1, $r2, L1 # branch if ! ( i == j )
addi $r1, $r1, 1 # i++
L1: addi $r2, $r2, -1 # j--
另外,in this link,也暗示它是MIPS程序集中的约定,以否定方式实现条件分支。我最好的选择是,这是为了保持常见的情况简单 - 因此很快 - 因为直觉上如果我们检查相等性,那么我们会期望它更有可能变得平等,因此当它不相等。我认为我只是努力使其合理,但我仍然无法区分在beq
或bne
中实施它的核心差异。如果有人解释原因我真的很感激。
答案 0 :(得分:3)
如果 使用beq
,请考虑代码的外观。你最终可能会这样:
beq $r1, $r2, L1
L2: addi $r2, $r2, -1 # j--
...
...
L1: addi $r1, $r1, 1 #i++
j L2
或者这个:
beq $r1, $r2, L1
addi $r2, $r2, -1 # j--
j L2
L1: addi $r1, $r1, 1 #i++
addi $r2, $r2, -1 # j--
L2:
在任何一种情况下,你都会在其中一个执行路径中有一个额外的分支,相比之下,如果你在开头使用了bne
那么。