我决定在前一天去组装,我一直在玩一些非常基本的事情,例如从argv到stdout的打印内容。我发现this great list of linux syscall numbers包含参数和所有内容,我很好奇为什么r10
和r8
之前的参数都使用r9
。我发现了关于什么可以在何时何地使用什么的各种奇怪的约定,例如rcx
中的循环计数器如何使用。为什么将r10
上移有特定原因吗?更方便吗?
我可能还应该出于好奇而对我对此感兴趣,而不是因为它引起了我的问题。
编辑:我发现this question接近,引用第124页的the x64 ABI documentation,其中它指出用户级别的应用程序使用rdi, rsi, rdx, rcx, r8, r9
。另一方面,内核使用r10
而不是rcx
,并破坏了rcx
和r11
。那也许可以解释r10
是如何结束的,但是为什么要交换它呢?
最佳答案
RCX
指令使用R11
以及syscall
,立即将其销毁。因此,这些寄存器不仅不会在系统调用后保存,而且甚至无法用于参数传递。因此,选择R10
替换无法使用的RCX
以传递第四个参数。
有关syscall
如何使用这些寄存器的更多信息,另请参见this answer。
引用:Intel's Instruction Set Reference,查找SYSCALL
。