我不确定这些推线有什么区别。 (修剪下来来自 Linux 的 x86/entry/calling.h https://github.com/torvalds/linux/blob/241e39004581475b2802cd63c111fec43bb0123e/arch/x86/entry/calling.h#L100,删除了异或零清除。)
.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0
pushq \rdx
pushq \rax
pushq %r11
pushq %r12
.endm
两者都压入堆栈吗?或者前两条推线有不同的作用吗?我在 Linux 上使用 GNU 工具链。
这些行位于.h
包含的文件.S
asm 源文件。
还有谁能告诉我这段代码的作用吗?
.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0
具体是 PUSH_AND_CLEAR_REGS 之后的代码。
Inside a GAS .macro https://sourceware.org/binutils/docs/as/Macro.html#Macro, 你用\foo
引用一个名为的宏参数foo
.
The .macro
您正在查看有 3 个带有默认值的参数;大概在某些用例中,他们希望获得保存的替代值来代替 RAX 和 RDX 中实际的值。但其余寄存器会像平常一样被保存和异或归零。
所以在宏观展开之后,是的,这只是push %rdx
and push %rax
,与push %r11
and push %r12
.
如果您正在查看旧版本的 Linux,我不知道,但这是在.h
被其他人包括在内.S
手写的asm源文件,not by .c
来源。我帮你解决了你的问题。
我认为对 GAS 宏定义的评论非常清楚地说明了该宏的用途。请参阅我添加到您的问题中的 github 链接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)