我决定在前一天去组装,我一直在玩一些非常基本的事情,例如从argv到stdout的打印内容。我发现this great list of linux syscall numbers包含参数和所有内容,我很好奇为什么r10r8之前的参数都使用r9。我发现了关于什么可以在何时何地使用什么的各种奇怪的约定,例如rcx中的循环计数器如何使用。为什么将r10上移有特定原因吗?更方便吗?

我可能还应该出于好奇而对我对此感兴趣,而不是因为它引起了我的问题。

编辑:我发现this question接近,引用第124页的the x64 ABI documentation,其中它指出用户级别的应用程序使用rdi, rsi, rdx, rcx, r8, r9。另一方面,内核使用r10而不是rcx,并破坏了rcxr11。那也许可以解释r10是如何结束的,但是为什么要交换它呢?

最佳答案

RCX指令使用R11以及syscall,立即将其销毁。因此,这些寄存器不仅不会在系统调用后保存,而且甚至无法用于参数传递。因此,选择R10替换无法使用的RCX以传递第四个参数。

有关syscall如何使用这些寄存器的更多信息,另请参见this answer

引用:Intel's Instruction Set Reference,查找SYSCALL

08-16 09:52