我正在使用 Watcom C 编译器 (wcc) 2.0 版。我编译这个简单的代码并启用了许多优化,但生成的 ASM 对我来说似乎非常未优化。
int test(int x) {
return x ? 1 : 2;
}
以 8086 为目标进行编译,最快的优化 ( -otexan
)。
wcc test.c -i="C:\Data\Projects\WATCOM/h" -otexan -d2 -bt=dos -fo=.obj -mc
然后拆卸:
wdis test.obj -s > test.dasm
生成的汇编程序如下所示:
...
return x ? 1 : 2;
02C7 83 7E FA 00 cmp word ptr -0x6[bp],0x0000
02CB 74 03 je L$39
02CD E9 02 00 jmp L$40
02D0 L$39:
02D0 EB 07 jmp L$41
02D2 L$40:
02D2 C7 46 FE 01 00 mov word ptr -0x2[bp],0x0001
02D7 EB 05 jmp L$42
02D9 L$41:
02D9 C7 46 FE 02 00 mov word ptr -0x2[bp],0x0002
02DE L$42:
02DE 8B 46 FE mov ax,word ptr -0x2[bp]
02E1 89 46 FC mov word ptr -0x4[bp],ax
02E4 8B 46 FC mov ax,word ptr -0x4[bp]
...
这些跳跃对我来说看起来没有经过优化。我希望减少不必要的跳转,并且可能将结果直接放在 AX 上,而不是把它放在 BP 位置和后面(最后两行)。
cmp word ptr -0x6[bp],0x0000
jz L$39
mov ax,0x0001
jmp L$40
L$39:
mov ax,0x0002
L$40:
...
我在那里错过了什么吗?wcc 是否出于某种原因忽略了我的开关?谢谢。