在讲座中,我们的教授说,在分支中使用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-- 此外,在这个链接中还暗示,在MIPS程序集中,以否定方式实现条件分支是一种惯例。我的最佳选择是,它是为了保持普通情况简单--因此是快速的--因为从直觉上说,如果我们检查的是相等性,那么我们就会期望它更有可能变得平等,因此当而不是相等时,PC会分支。我认为我只是努力让它变得合理,但是我仍然无法区分在beq中实现它还是在bne中实现它的核心区别。如果有人解释原因,我会非常感激的。
发布于 2016-01-21 06:52:25
考虑一下,如果您使用了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相比,在其中一个执行路径中都会有一个额外的分支。
https://stackoverflow.com/questions/34914531
复制相似问题