【问题标题】:IF condition in C translation to MIPSC 转换为 MIPS 中的 IF 条件
【发布时间】:2016-01-17 02:20:02
【问题描述】:

我想知道为什么 if(x == y)在C编程语言中翻译成 'bne' 条件而不是 MIPS 中的 'beq' 条件?

【问题讨论】:

  • bne => ne 对于not equal。 beq => eq 为equal

标签: c mips


【解决方案1】:

暂时忽略条件,考虑这些代码块在汇编语言指令流中可能打印的顺序:

// A
if (x == y) {
    // B
}
// C
  • x == y 为真时,流程按顺序从 A 到 B 到 C。相等时不需要跳转 (beq),因为所需的流程与指令中打印块的方式相匹配流。

  • 1234563 /p>

当然,仅将这些作为此特定案例的示例思考过程。

在一般情况下,这些都是实现细节。编译器可以以它认为合适的任何方式打印指令,包括反转条件。 (请记住,由于现代 CPU 流水线的存在,编译器的一个强大的优化目标通常是成功猜测最可能的执行路径并确保它包含尽可能少的跳转。)

【讨论】:

  • 为什么要尽可能避免跳跃? (当然除了代码中的混乱)
  • @erezlale 这是一个强大的优化目标对于编译器,而不是程序员(通常)。您可以在此处阅读有关原因的更多信息:en.wikipedia.org/wiki/Instruction_pipelining 请记住,这不一定适用于您的问题。我只是顺便提到了它,以指出编译器可能会在指令流中反转高级条件。也就是说,在编写 C 代码时,您不应该依赖于分支指令的类型(beqbne 或其他任何东西)。
【解决方案2】:

如果条件为假,最好在 if 块上进行分支,而不是在条件为真时执行 if 块。

这些听起来很相似,但比较以下:

if (x == y)
{
    A;
}
B;

相当于(伪Cbne变体):

if (x != y)
    goto not_equal;
A;
not_equal:
B;

只有x != y才会分支。

如果你使用beq,你会得到这个烂摊子:

if (x == y)
    goto equal;
goto not_equal;
equal:
    A;
not_equal:
B;

在这两种情况下都会分支。

即使没有指令流水线,有时只进行分支也比总是进行分支更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多