我正在二进制文件中搜索特定指令,对于该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 的指令还是没有优化集?
insnxor %eax, %eax是在窥孔优化期间生成的。粗略地说,窥视孔优化过程会遍历代码寻找常见的模式/习惯用法,已知这些模式/习惯用法在目标 CPU 上性能更好。
要回答您的问题,您必须使用 启用窥孔优化-fpeephole2。
附言。-fpeephole2由 启用-O2,但不是由 启用-O1。