GCC何时插入异或eax,eax?

use*_*170 2 x86 assembly gcc

我正在二进制文件中搜索特定指令,对于该xor eax,eax指令,我有一个如下函数:

int foo(){
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用 GCC 4.7.2 和 -O2 或 -O3 优化标志编译它,则汇编结果foo()很好

xor eax,eax
Run Code Online (Sandbox Code Playgroud)

在退出该函数之前。相反,如果使用 -O1 编译甚至没有优化,经典的

mov eax,0x0
Run Code Online (Sandbox Code Playgroud)

被生产。

问题是:是否有其他方法(就 C 代码而言并且没有 __asm 指令)来生成

xor eax,eax
Run Code Online (Sandbox Code Playgroud)

带有 GCC 和 -O1 的指令还是没有优化集?

chi*_*ill 5

insnxor %eax, %eax是在窥孔优化期间生成的。粗略地说,窥视孔优化过程会遍历代码寻找常见的模式/习惯用法,已知这些模式/习惯用法在目标 CPU 上性能更好。

要回答您的问题,您必须使用 启用窥孔优化-fpeephole2

附言。-fpeephole2由 启用-O2,但不是由 启用-O1