我想知道为什么
用{C>编程语言翻译成if(x == y)
MIPS中'bne'条件而非'beq'条件?
答案 0 :(得分:6)
暂时忽略条件,考虑这些代码块可能在汇编语言指令流中打印的顺序:
// A
if (x == y) {
// B
}
// C
当x == y
为真时,流程从A到B依次顺序进行C.在等式(beq
)上不需要跳转,因为所需的流程与在指令流中打印块的方式。
当x == y
为假时,在A结束时,流程必须绕过B并直接跳到C.这就是为什么在不等式上触发分支指令是有道理的( bne
)。
当然,仅将这些视为此特定案例的思维过程。
在一般情况下,这些都是实施细节。编译器可以以其认为合适的任何方式打印指令,包括反转条件。 (请记住,由于现代CPU流水线,编译器成功猜测最可能的执行路径并确保其包含尽可能少的跳转通常是一个强大的优化目标。)
答案 1 :(得分:3)
如果条件为假,最好分支if-block,而不是在条件为真时执行if-block。
这些声音非常相似,但请比较以下内容:
if (x == y)
{
A;
}
B;
等同于(伪C bne
变体):
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;
将在两种情况下分支。
即使没有指令管道,分支有时仅比总是分支更有效。