我在一个二进制文件中搜索特定的指令,对于xor eax,eax指令,我有一个如下的函数:
int foo(){
return 0;
}如果我用GCC 4.7.2和-O2或-O3优化标志进行编译,foo()的汇编结果是很好的
xor eax,eax在退出函数之前。相反,如果使用-O1进行编译,甚至不进行优化,那么经典的
mov eax,0x0是生产出来的。
问题是:有没有其他方法(就C代码而言,不使用__asm指令)来生成
xor eax,eax有了GCC和-O1的指令,还是没有优化集?
发布于 2012-11-16 01:01:32
在窥视孔优化期间生成insn xor %eax, %eax。粗略地说,窥视优化通过遍历代码来寻找常见的模式/习惯用法,众所周知,这些模式/习惯用法在目标CPU上执行得更好。
要回答您的问题,您必须使用-fpeephole2启用窥视孔优化。
PS。-fpeephole2由-O2启用,但不由-O1启用。
发布于 2012-11-16 00:15:33
要获取xor指令,可以使用xor运算符:
register int i = 1;
i = i ^ i;然而,确保i使用eax可能更不确定。
发布于 2012-11-16 00:27:46
在不使用-O2或高级优化(并且不使用二元运算本身)的情况下,在GCC中生成具有寄存器的xor eax,eax真的很难。
这是因为xor eax,eax等同于mov eax,0,但是出于某种原因,GCC使用xor方法进行优化(我不知道哪种方法更快)。因此,如果您希望在没有任何优化的情况下生成这样的汇编代码,除了在C/C++ (^)中使用真正的xor运算符之外,您可能不会那么容易获得它。
现在,如果您使用-O2及更高版本,则很容易获得此类指令,例如:
#include <stdio.h>
int main(void)
{
int a = 0;
printf("%d", a);
return 0;
}如果用-O2编译,这将产生两个xor r1,r1,其中r1是一个任意寄存器。第一个xor指令在a的初始化过程中,第二个指令在return的值中,这个值是0,所以它会生成一个xor eax,eax。
要测试我的示例,可以使用带有-O2选项的GCC Explorer。
https://stackoverflow.com/questions/13401612
复制相似问题