我使用的是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是否出于某种原因忽略了我的开关?谢谢。
发布于 2021-08-27 11:42:17
问题出在生成详细调试信息的-d2开关上。它可能插入了不必要的行,以对应于原始C文件的行(也许是为了能够在那里放置硬件断点?)。我换成了-d1,瞧:
01A0 test_:
01A0 85 C0 test ax,ax
01A2 74 04 je L$15
01A4 B8 01 00 mov ax,0x0001
01A7 C3 ret
01A8 L$15:
01A8 B8 02 00 mov ax,0x0002
01AB C3 rethttps://stackoverflow.com/questions/68952834
复制相似问题