汇编程序产生负面形式的条件,而非正面条件

时间:2015-08-19 15:14:09

标签: c gcc assembly powerpc

我想知道为什么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

有人可以解释一下会发生什么吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

否定形式的原因很简单:分支与if相反。分支表示“跳过if”,而if表示“执行if”。因此,对于具有条件分支模型的程序集,将取消所有if条件以转换为单个分支。对于if + else,它无关紧要,因为这两者可以交换,但通常会保留否定。

否定是直观的事情;举个例子:

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

当你“运行”你头脑中的代码时,你会怎么做?你看一下情况,检查一下是否属实。如果是,则执行x++,然后y++。如果不是,则直接跳至y++。换句话说,如果条件为false,则跳转(分支)到y++;你直观地否定了这个条件。