MIPS - 使用 bne 的分支约定
MIPS - Branching convention with bne
在讲座中,我们的教授说在分支中使用 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 汇编中的约定,以在否定[=26]中实现条件分支=] 方式。我最好的选择是,这是为了保持常见情况的简单 - 因此快速 -,因为从直觉上来说,如果我们检查是否相等,那么我们会期望它更有可能变得相等,因此 PC 在 不相等。我想我只是努力让它变得合理,但我仍然无法区分在 beq
或 bne
中实现它的核心区别。如果有人解释原因,我将不胜感激。
考虑一下如果您曾 使用 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
相比,在其中一个执行路径中都会有一个额外的分支。
在讲座中,我们的教授说在分支中使用 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 汇编中的约定,以在否定[=26]中实现条件分支=] 方式。我最好的选择是,这是为了保持常见情况的简单 - 因此快速 -,因为从直觉上来说,如果我们检查是否相等,那么我们会期望它更有可能变得相等,因此 PC 在 不相等。我想我只是努力让它变得合理,但我仍然无法区分在 beq
或 bne
中实现它的核心区别。如果有人解释原因,我将不胜感激。
考虑一下如果您曾 使用 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
相比,在其中一个执行路径中都会有一个额外的分支。