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

标签 gcc assembly x86

GCC 经常产生以下 x86 程序集来设置 eax 中的值在返回给调用者之前到 0:

xor eax, eax

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

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

最佳答案

你的意思是像 sub eax,eax这是仅在某些 CPU 上被特别识别为归零习语,而不是全部?

优化是作为 -fpeephole2 的一部分完成的,作为 -O2 的一部分或 -Os ;使用 -fno-peephole2会给你mov eax,0用于实现 0在一个寄存器中。 (以及我假设创建其他错过的优化!异或归零可能不是 gcc 寻找的唯一窥视孔。)

我不知道在哪里查看 gcc 源代码,但知道该选项可能有助于追踪它。

不过,它不在“libgcc”中,它是 32 位机器上的 64 位乘法等辅助函数。 (当 gcc 发出对类似 __udivdi3 之类的有趣命名帮助函数的调用时,它期望 asm 输出与 libgcc 链接)。

更像是您会在 x86 机器定义文件中找到它,这是 .md 之一。 gcc 源代码树中的文件。否则硬编码到 C 优化函数中。赞 "xor %1, %0"可能是要搜索的东西,或者更有可能是 {... | ...}方言替代品。但是在xor上搜索助记符可能仍然有帮助。

这是一个半途而废的部分答案。如果您知道在哪里看,请发布具体答案或至少发表评论。

关于gcc - 更改 GCC 的输出以进行 0-set(清除)操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475961/

相关文章:

gcc - X86中mov和movl指令的区别?我在阅读汇编时遇到了一些麻烦

c++ - Qt:Centos 6.7 session 管理错误和符号查找错误

c++ - 关于反汇编输出的问题

assembly - 编译汇编与手写汇编的性能差异

assembly - 读取 GDTR 的值

linux - 如何执行 x86 计算机的硬件重置?

c++ - 执行用C++编写的.exe问题(使用mingw编译器)

c++ - gcc-4.8(和 4.9)无法识别 -std=c++11 参数

c - 如何获取 `gcc` 以从标准 C 为 x86-64 生成 `bts` 指令?

c - 混合 C 和汇编源代码并使用 cmake 构建