我不确定这些推送线有什么区别。 (在from Linux's x86/entry/calling.h上进行了整理,删除了“零或零”清除。)
.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0
pushq \rdx
pushq \rax
pushq %r11
pushq %r12
.endm
是否都推入堆栈?还是前两条推线做些不同的事情?我在Linux上使用GNU工具链。
这些行在.h
asm源文件中包含的.S
文件中找到。
还有谁能告诉我这段代码的作用吗?
.macro PUSH_AND_CLEAR_REGS rdx=%rdx rax=%rax save_ret=0
特别是PUSH_AND_CLEAR_REGS之后的代码。
答案 0 :(得分:2)
在a GAS .macro
内,您使用\foo
来引用名为foo
的宏参数。
您正在查看的.macro
具有3个带有默认值的参数;大概在某些用例中,他们想要保存替代值来代替RAX和RDX中的实际值。但是其余的寄存器会像平常一样保存并进行异或归零。
因此,在宏扩展之后,是push %rdx
和push %rax
,与push %r11
和push %r12
一样。
IDK(如果您正在查看旧版本的Linux),但是它在其他.h
手写asm源文件中包含的.S
中,而不是 .c
个来源。我为您解决了问题。
我认为关于GAS宏定义的评论对于此宏的用途非常清楚。请参阅我添加到您的问题的github链接。