为什么系统调用clocber rcx?

时间:2018-05-28 17:41:41

标签: linux assembly x86-64 system-calls

在书Low-Level Programming: C, Assembly, and Program Execution on Intel® 64 Architecture中,它说,

  

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

     

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

您可以在此Stack Overflow post

中看到此内容
  

系统调用通过syscall指令完成。这个clobbers%rcx和%r11,以及%rax,但保留了其他寄存器。

我了解了rax来存储返回代码,但为什么rcxr11syscall中遭到破坏?是否有一个特定的系统调用列表,其中包含rcx / r11?是否有一个破坏的惯例?他们在任何系统调用中都被认为是安全的吗?

1 个答案:

答案 0 :(得分:3)

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

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