为什么系统调用会破坏 rcx 和 r11?

Eva*_*oll 5 linux assembly x86-64 system-calls

在《低级编程:英特尔® 64 位架构上的 C、汇编和程序执行》一书中它说:

关于系统调用参数 系统调用的参数与函数的参数存储在一组不同的寄存器中。第四个参数存储在 中r10,而函数接受第四个参数rcx

原因是syscall指令隐式使用rcx. 系统调用不能接受超过六个参数。

您可以在此Stack Overflow 帖子中也看到这一点,

系统调用是通过 syscall 指令完成的。这会破坏 %rcx 和 %r11,以及 %rax,但保留其他寄存器。

我理解 clobberingrax存储返回码,但为什么是rcx, 并且r11clobbered in syscall?是否有破坏rcx/的特定系统调用的列表r11?有没有关于破坏的约定?它们在任何系统调用中都被认为是安全的吗?

int*_*jay 5

系统调用指令使用rcx存储的下一条指令的地址返回,并r11保存的值rflags寄存器。然后这些值将被sysret指令恢复。

这是由 CPU 在执行 CPU 指令时完成的,因此任何特定于操作系统的调用约定都需要避免使用这些寄存器将参数传递给系统调用。