【发布时间】:2017-09-29 16:07:04
【问题描述】:
我最近偶然发现了一个我不理解的有趣的编译器代码。 取以下代码:
unsigned char x;
...
x |= 127;
x |= 128;
对于第一条语句,编译器生成:
or eax, 0x7f.
但是,对于第二个语句,它变成:
or eax, 0xffffff80
似乎对于小于 127 的值,使用 1 字节值,而 128 之后的 dword 是首选。
有人知道为什么会这样吗? 我复制了这个 gcc 6.2(我认为是最新的)。
我尝试在 gcc 邮件列表(gcc-bugs@gcc.gnu.org 或 gcc-help@gcc.gnu.org)上发帖,但我只收到了投递失败。
【问题讨论】:
-
我怀疑这只是您的反汇编程序格式化数字的一种伪影(
0x80如果解释为有符号数字,则为负数)。 -
我正在使用 gdb。这是它在控制台中打印值的方式pastebin.com/0A2SXUNU
-
我还用 -S 编译了代码,得到了这个:pastebin.com/g8aSn9iy
-
如果使用 gcc -S 编译,生成的 .s 文件有
orl $-128, %eax。对于邮件列表,通常失败带有解释(通常,您尝试发送 html 电子邮件而不是纯文本)。 -
两条指令都执行 32 位“双字”大小的 OR 运算,并且两条指令都使用符号扩展为 32 位的 8 位立即操作数进行编码。
标签: c gcc assembly compiler-optimization cpu-registers