Optimization x86二进制数据膨胀-32位偏移量,8位即可

Optimization x86二进制数据膨胀-32位偏移量,8位即可,optimization,binary,x86,llvm,Optimization,Binary,X86,Llvm,我正在使用clang+llvm2.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) 事实上,这些浪费的寻址字节占我整个二进制

我正在使用clang+llvm2.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,这不是您想要的。

能否提供示例CC代码,以及您希望使用的程序集/desire@srking:有符号的位移实际上非常有用。@Stephen:当然有用,但与完整的8位正位移值相比,这是目前最主要的情况。@srking在
ebp
上的负位移通常用于引用函数中的局部变量,因为它们被放置在内存中堆栈帧的正下方。@ughoavgfhw是真的,但ebp堆栈帧几乎已成为过去-fomit帧指针正在成为一种标准优化,因为它是一种高效的win,而DWARF调试格式解决了调试问题。再次感谢你的帮助@srking-因此现在有一个保持堆栈帧较小的动机。:-)