Assembly 带bne的MIPS分支约定
在讲座中,我们的教授说,在分支中使用Assembly 带bne的MIPS分支约定,assembly,mips,branch-prediction,Assembly,Mips,Branch Prediction,在讲座中,我们的教授说,在分支中使用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汇编中,以否定方式实现条件分支是一种约定。我的最佳选择是,它是为了保持
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
中实现它的核心区别。如果有人能解释原因,我将不胜感激。考虑一下如果您使用了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
相比,在其中一个执行路径中都会有一个额外的分支。考虑一下如果使用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
相比,在其中一条执行路径中都会有一个额外的分支。Aha我认为问题不仅在于放置分支,还在于编写一条指令来实现整个功能。这可能不是首选,因为它会占用指令内存中的大量空间。但是我想知道,如果我们使用if-else呢?它再次使用了相同的否定模式,尽管我相信,我们不一定需要。啊哈,我认为问题不仅在于放置一个分支,而且在于编写多条指令来实现整体功能。这可能不是首选,因为它占用了指令内存中的大量空间。但是我想知道,如果我们使用if-else呢?它再次使用了相同的否定模式,尽管我相信,我们不需要这样做。