更改GCC的输出以进行0组(清除)操作

时间:2019-08-13 10:35:15

标签: gcc assembly x86

GCC通常会生成以下x86程序集,以将eax中的值设置为0,然后再返回到调用方:

xor eax, eax

出于可以这样做吗?的目的,而不是应该这样做?,是否可以更改GCC的行为以产生“等效”程序集?另外,这一代在libgcc中发生在什么地方?

澄清一下,我不是在寻找适合使用哪种汇编指令的指南,我想知道如何改变GCC的输出行为。

1 个答案:

答案 0 :(得分:3)

您的意思是像sub eax,eax那样,它仅在某些CPU而非全部CPU上被公认为归零习惯?

作为-fpeephole2的一部分,-O2-Os的一部分进行优化;使用-fno-peephole2将使您mov eax,0在寄存器中实现0。 (除了创建其他我认为可能的优化之外!xor归零可能不是gcc寻找的唯一窥视孔。)

我不知道在gcc源代码中查找的位置,但是知道该选项可能有助于对其进行跟踪。

尽管它不在“ libgcc”中,但它是辅助功能,例如32位计算机上的64位乘法。 (当gcc发出对诸如__udivdi3之类的有趣名称的辅助函数的调用时,它期望将asm输出链接到libgcc。)

更像您在x86机器定义文件(gcc源代码树中的.md文件之一)中找到它一样。否则,将其硬编码为C优化函数。像"xor %1, %0"可能是要搜索的内容,或者更有可能包含{... | ...}的方言替代词。但是搜索xor助记符可能仍然有帮助。

这是半确定的部分答案。请张贴特定的答案,或者如果您知道要看的地方,请至少发表评论。