为什么 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 的正常用户空间顺序是:rdi
、rsi
、rdx
、rcx
、r8
,然后 r9
。这不是更合乎逻辑,我不知道他们是怎么想出来的。
由于 syscall
指令破坏了 rcx
,因此必须替换 r10
。这至少有点合乎逻辑:)
根据 架构调用约定 部分中的 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 的正常用户空间顺序是:rdi
、rsi
、rdx
、rcx
、r8
,然后 r9
。这不是更合乎逻辑,我不知道他们是怎么想出来的。
由于 syscall
指令破坏了 rcx
,因此必须替换 r10
。这至少有点合乎逻辑:)