此反斜杠在此汇编代码中起什么作用?

时间:2019-06-20 05:17:08

标签: gcc assembly linux-kernel x86-64 gas

我不确定这些推送线有什么区别。 (在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之后的代码。

1 个答案:

答案 0 :(得分:2)

a GAS .macro内,您使用\foo来引用名为foo的宏参数。

您正在查看的.macro具有3个带有默认值的参数;大概在某些用例中,他们想要保存替代值来代替RAX和RDX中的实际值。但是其余的寄存器会像平常一样保存并进行异或归零。

因此,在宏扩展之后,是push %rdxpush %rax,与push %r11push %r12一样。


IDK(如果您正在查看旧版本的Linux),但是它在其他.h手写asm源文件中包含的.S中,而不是 .c个来源。我为您解决了问题。

我认为关于GAS宏定义的评论对于此宏的用途非常清楚。请参阅我添加到您的问题的github链接。