首页 > 解决方案 > 为什么系统调用会破坏 rcx 和 r11?

问题描述

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

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

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

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

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

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

标签: linuxassemblyx86-64system-calls

解决方案


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

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


推荐阅读