首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Watcom中糟糕的C优化

Watcom中糟糕的C优化
EN

Stack Overflow用户
提问于 2021-08-27 11:42:17
回答 1查看 27关注 0票数 1

我使用的是Watcom C编译器(wcc) 2.0版。我编译这段简单的代码时启用了许多优化,但生成的ASM对我来说似乎非常不优化。

代码语言:javascript
复制
int test(int x) {

    return x ? 1 : 2;
}

以8086为目标进行编译,最快的可能优化(-otexan)。

代码语言:javascript
复制
wcc test.c -i="C:\Data\Projects\WATCOM/h" -otexan -d2 -bt=dos -fo=.obj -mc

然后使用以下命令进行反汇编:

代码语言:javascript
复制
wdis test.obj -s > test.dasm

生成的汇编程序如下所示:

代码语言:javascript
复制
...
    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位置下(最后两行)。

代码语言:javascript
复制
    cmp      word ptr -0x6[bp],0x0000
    jz       L$39
    mov      ax,0x0001
    jmp      L$40
L$39:
    mov      ax,0x0002
L$40:
    ...

我是不是漏掉了什么?wcc是否出于某种原因忽略了我的开关?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-27 11:42:17

问题出在生成详细调试信息的-d2开关上。它可能插入了不必要的行,以对应于原始C文件的行(也许是为了能够在那里放置硬件断点?)。我换成了-d1,瞧:

代码语言:javascript
复制
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              ret
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68952834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档