c - 汇编器生成否定形式的条件,而不是肯定形式的条件

标签 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

谁能解释一下发生了什么吗?

提前致谢。

最佳答案

否定形式的原因很简单:分支与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/

相关文章:

c - 该 C 程序在其他计算机上按预期运行,但在我的计算机上表现奇怪

c - 生产者-消费者 w/pthreads + C 中的信号量(同时访问缓冲区槽)

c - fgets 错误消息循环 - C 中的 Linux shell

C++ gcc `floorf` 不是 `std` 的成员?

assembly - 在 x86 程序集中将整数打印到控制台

gcc - 了解堆栈对齐强制

arrays - 此 MARIE 代码是否找到数组中的最小数字?

c - 结构体数组的动态内存分配。计划结束 [C]

C 字符串向后赋值

c - 如何强制使用 '-pg' 编译的程序在仍在运行时转储其统计信息?