首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC什么时候插入一个xor eax,eax?

GCC什么时候插入一个xor eax,eax?
EN

Stack Overflow用户
提问于 2012-11-16 00:13:08
回答 3查看 2.6K关注 0票数 2

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

代码语言:javascript
复制
int foo(){
  return 0;
}

如果我用GCC 4.7.2和-O2或-O3优化标志进行编译,foo()的汇编结果是很好的

代码语言:javascript
复制
xor eax,eax

在退出函数之前。相反,如果使用-O1进行编译,甚至不进行优化,那么经典的

代码语言:javascript
复制
mov eax,0x0

是生产出来的。

问题是:有没有其他方法(就C代码而言,不使用__asm指令)来生成

代码语言:javascript
复制
xor eax,eax

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

EN

回答 3

Stack Overflow用户

发布于 2012-11-16 01:01:32

在窥视孔优化期间生成insn xor %eax, %eax。粗略地说,窥视优化通过遍历代码来寻找常见的模式/习惯用法,众所周知,这些模式/习惯用法在目标CPU上执行得更好。

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

PS。-fpeephole2-O2启用,但不由-O1启用。

票数 4
EN

Stack Overflow用户

发布于 2012-11-16 00:15:33

要获取xor指令,可以使用xor运算符:

代码语言:javascript
复制
register int i = 1;
i = i ^ i;

然而,确保i使用eax可能更不确定。

票数 0
EN

Stack Overflow用户

发布于 2012-11-16 00:27:46

在不使用-O2或高级优化(并且不使用二元运算本身)的情况下,在GCC中生成具有寄存器的xor eax,eax真的很难。

这是因为xor eax,eax等同于mov eax,0,但是出于某种原因,GCC使用xor方法进行优化(我不知道哪种方法更快)。因此,如果您希望在没有任何优化的情况下生成这样的汇编代码,除了在C/C++ (^)中使用真正的xor运算符之外,您可能不会那么容易获得它。

现在,如果您使用-O2及更高版本,则很容易获得此类指令,例如:

代码语言:javascript
复制
#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13401612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档