为什么 x86_64 程序集有奇怪的系统调用参数顺序?

Why does x86_64 assembly have odd syscall argument order?

根据 架构调用约定 部分中的 syscall man page,它说明了每个架构系统调用参数的各种寄存器顺序。除了 x86_64 之外,所有这些都具有某种逻辑上的有序意义。比如arm64依次使用x0、x1、x2、x3、x4、x5,这看起来符合逻辑,而且是数字顺序。但对于 x86_64,顺序是 rdi、rsi、rdx、r10、r8,然后是 r9。这对我来说似乎不太合乎逻辑,这让我感到困惑。为什么x86_64会这样?

谢谢!

根据 x86-64 ABI 的正常用户空间顺序是:rdirsirdxrcxr8,然后 r9。这不是更合乎逻辑,我不知道他们是怎么想出来的。

由于 syscall 指令破坏了 rcx,因此必须替换 r10。这至少有点合乎逻辑:)