2

我正在二进制文件中搜索特定指令,对于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 的指令还是没有优化集?

4

3 回答 3

4

xor %eax, %eax在窥视孔优化期间生成insn 。粗略地说,窥视孔优化通过遍历代码以寻找常见的模式/习语,已知这些模式/习语在目标 CPU 上表现更好。

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

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

于 2012-11-15T17:01:31.833 回答
0

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

register int i = 1;
i = i ^ i;

但是,确保i使用eax可能更加不确定。

于 2012-11-15T16:15:33.437 回答
0

如果不使用 a或高级优化(并且不使用二进制操作本身),xor eax,eax在 GCC 中生成带有寄存器的a 真的很困难。-O2

那是因为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;
}

这将产生两个xor r1,r1wherer1是一个任意寄存器,如果用-O2. 第一个异或指令在a's 的初始化中。第二个在return值中,即 0,所以它正在生成一个xor eax,eax.

要测试我的示例,您可以使用带有选项的GCC Explorer 。-O2

于 2012-11-15T16:27:46.263 回答