x86_64 SysV ABI的函数调用约定定义了要在rcx
寄存器中传递的整数参数#4。另一方面,Linux内核系统调用ABI为了同样的目的使用r10
。所有其他参数都传递到函数和系统调用的相同寄存器中。x86_64 Linux函数和系统调用之间的ABI差异
这会导致一些奇怪的事情。退房,例如,mmap
glibc中实现了X32平台(针对同一存在差异):
00432ce0 <__mmap>:
432ce0: 49 89 ca mov %rcx,%r10
432ce3: b8 09 00 00 40 mov $0x40000009,%eax
432ce8: 0f 05 syscall
因此,所有的寄存器都已经到位,但我们移动rcx
到r10
。
我想知道为什么不把系统调用ABI定义为与函数调用ABI相同,因为它们已经如此相似。
在[另一个ABI答案](http://stackoverflow.com/a/35619528/224132)中,我发现了一些AMD架构师和Linux内核开发人员发布amd64邮件列表帖子的链接,之后发布了第一个AMD64芯片。这里有一些有趣的东西,比如实验结果(从编译SPECint并查看代码大小和指令数量)导致x86-64 SysV ABI选择哪个寄存器用于什么。 –