汇编程序生成负面形式的条件,而不是正面的

Assembler generates negative forms of conditions, not positive one

我想知道为什么 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 的反义词。分支意味着 "skip if",而 if 意味着 "execute if"。因此,对于具有条件分支模型的程序集,所有 if 条件都将被否定以转换为单个分支。对于if+else,这并不重要,因为两者可以交换,但通常保留否定。

否定是这里的直觉;举个例子:

if (x == 10)
{
    x++;
}
y++;

当你"run"脑海中的代码时,你会做什么?您查看条件,并检查它是否为真。如果是,则执行 x++,然后执行 y++。如果不是,则直接跳转到 y++。换句话说,如果条件为假,则跳(分支)到 y++ ;你凭直觉否定了这个条件。