gpt4 book ai didi

optimization - x86 二进制膨胀 - 32 位偏移,而 8 位就可以了

转载 作者:行者123 更新时间:2023-12-03 17:10:52 25 4
gpt4 key购买 nike

我正在使用 clang+LLVM 2.9 通过 -Os 选项编译 x86 的各种工作负载。小的二进制大小很重要,我必须使用静态链接。所有二进制文件都是 32 位的。

我注意到许多指令使用 32 位位移的寻址模式,而实际上只使用 8 位。例如:

89 84 24 d4 00 00 00     mov    %eax,0xd4(%esp)

为什么编译器/汇编器不选择紧凑的8位位移?

89 44 24 d4              mov    %eax,0xd4(%esp)

事实上,这些浪费的寻址字节占整个二进制文件的 2% 以上!

我查看了 LLVM 的链接时间优化并尝试了 --emit-llvm,但它没有提到或帮助这个问题。

是否有一些链接时优化可以利用实际位移的知识来选择较小的指令形式?

感谢您的帮助!

最佳答案

在 x86 中,偏移量是有符号的。这允许您访问基地址两侧的数据。因此,8 位偏移量的范围是 -128 到 127。您的指令正在引用向前 212 个字节的数据(十进制值 0xD4)。如果使用 8 位偏移量对其进行编码,则十进制数将为 -44,这不是您想要的。

关于optimization - x86 二进制膨胀 - 32 位偏移,而 8 位就可以了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com