C语言中的IF条件转换为MIPS

ere*_*ale 3 c mips

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

The*_*kis 6

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

// A
if (x == y) {
    // B
}
// C
Run Code Online (Sandbox Code Playgroud)
  • 如果x == y为true,则流程从A到B顺序进行到C.在equality(beq)上不需要跳转,因为所需的流程与在指令流中打印块的方式相匹配.

  • x == y为假时,在A结束时,流必须绕过B并直接跳到C.这就是为什么在不等式(bne)上触发分支指令是有意义的.


当然,仅将这些视为此特定情况的一个示例思维过程.

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