在书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
来存储返回代码,但为什么rcx
和r11
在syscall
中遭到破坏?是否有一个特定的系统调用列表,其中包含rcx
/ r11
?是否有一个破坏的惯例?他们在任何系统调用中都被认为是安全的吗?
答案 0 :(得分:3)
syscall指令使用rcx
存储要返回的下一条指令的地址,r11
保存rflags
寄存器的值。然后,sysret
指令将恢复这些值。
这是由CPU在执行CPU指令时完成的,因此任何特定于操作系统的调用约定都需要避免使用这些寄存器将参数传递给系统调用。