汇编程序生成负面形式的条件,而不是正面的
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++
;你凭直觉否定了这个条件。
我想知道为什么 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++
;你凭直觉否定了这个条件。