我想知道为什么 gcc
汇编器使用否定形式的条件而不是肯定形式。假设我们有以下 C
代码:
if (x == 10)
{
x ++;
}
y ++;
当我使用gcc
编译生成目标文件时,PowerPC
汇编中的汇编代码结果如下:
20: 2c 00 00 0a cmpwi r0,10
24: 40 82 00 10 bne 34 <main+0x34>
28: 81 3f 00 08 lwz r9,8(r31)
2c: 38 09 00 01 addi r0,r9,1
30: 90 1f 00 08 stw r0,8(r31)
34: 81 3f 00 0c lwz r9,12(r31)
38: 38 09 00 01 addi r0,r9,1
3c: 90 1f 00 0c stw r0,12(r31)
程序集使用 bne
,而我在 C
代码中使用相同的 ==
。
编辑1:
我知道代码运行良好。但我的意思是为什么汇编程序使用负形式而不是正形式。
编辑2: 我正在使用带有 0 级优化器的编译器,我们知道它并不智能。我的问题是,为什么汇编器不能生成如下所示的汇编:
cmpi x, 10
beq label1
b label2
label1:
add x, x, 1
label2:
add y, y, 1
谁能解释一下发生了什么吗?
提前致谢。
最佳答案
否定形式的原因很简单:分支与if
相反。分支意味着“跳过 if”,而 if
意味着“执行 if”。因此,对于具有条件分支模型的程序集,所有 if
条件都将被否定以转换为单个分支。对于 if
+else
来说,这并不重要,因为两者可以交换,但通常会保留否定。
否定是这里直观的事情;举个例子:
if (x == 10)
{
x++;
}
y++;
当你在脑海中“运行”代码时,你会做什么?您查看条件,并检查它是否正确。如果是,则执行 x++
,然后执行 y++
。如果不是,则直接跳转到 y++
。换句话说,如果条件为 false ,则跳转(分支)到 y++ ;你直觉地否定了这个条件。
关于c - 汇编器生成否定形式的条件,而不是肯定形式的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099489/