我想知道为什么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
有人可以解释一下会发生什么吗?
提前致谢。
答案 0 :(得分:1)
否定形式的原因很简单:分支与if
相反。分支表示“跳过if”,而if
表示“执行if”。因此,对于具有条件分支模型的程序集,将取消所有if
条件以转换为单个分支。对于if
+ else
,它无关紧要,因为这两者可以交换,但通常会保留否定。
否定是直观的事情;举个例子:
if (x == 10)
{
x++;
}
y++;
当你“运行”你头脑中的代码时,你会怎么做?你看一下情况,检查一下是否属实。如果是,则执行x++
,然后y++
。如果不是,则直接跳至y++
。换句话说,如果条件为false,则跳转(分支)到y++
;你直观地否定了这个条件。