【问题标题】:MIPS - Branching convention with bneMIPS - 使用 bne 的分支约定
【发布时间】:2025-11-28 19:45:01
【问题描述】:

在讲座中,我们的教授说在分支中使用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 程序集中以 否定 方式实现条件分支是一个约定。我最好的选择是,它是为了保持普通情况简单 - 因此快速 - 因为直观地说,如果我们检查是否相等,那么我们会期望它更有可能变得相等,因此当它是 相等。我想我只是努力使它合理,但我仍然无法区分在beqbne 中实现它的核心区别。如果有人解释原因,我将不胜感激。

【问题讨论】:

    标签: assembly mips branch-prediction


    【解决方案1】:

    考虑一下如果您使用了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 相比,在任何一种情况下,您都会在其中一个执行路径中有一个额外的分支。

    【讨论】:

    • 啊哈,我认为问题不仅在于放置一个分支,而且在于编写更多指令来实现整体功能。
    • 这可能不是首选,因为在指令内存中占用了大量空间。但是我想知道,如果我们使用 if-else 怎么办?它再次使用相同的否定模式,尽管我相信我们不一定需要这样做。