我正在使用clang + LLVM 2.9使用-Os选项编译x86的各种工作负载。小二进制大小很重要,我必须使用静态链接。所有二进制文件都是32位。
我注意到,当实际使用的只有8位时,许多指令使用具有32位位移的寻址模式。例如:
89 84 24 d4 00 00 00 mov %eax,0xd4(%esp)
为什么编译器/汇编器没有选择紧凑的8位位移?
89 44 24 d4 mov %eax,0xd4(%esp)
事实上,这些浪费的寻址字节超过了我整个二进制文件的2%!
我查看了LLVM的链接时间优化并尝试了--emit-llvm,但它没有提及或帮助解决这个问题。
是否有一些链接时优化可以使用实际位移的知识来选择较小的指令形式?
感谢您的帮助!
答案 0 :(得分:6)
在x86中,偏移已签名。这允许您访问基址两侧的数据。因此,8位偏移的范围是-128到127.您的指令正在引用正向212字节的数据(十进制值0xD4)。如果它是使用8位偏移量编码的,则十进制为-44,这不是你想要的。