繁体   English   中英

Linux x64:为什么 r10 在系统调用中排在 r8 和 r9 之前?

[英]Linux x64: why does r10 come before r8 and r9 in syscalls?

前几天我决定尝试组装,我一直在玩非常基本的东西,比如从 argv 到 stdout 打印东西。 我发现了这个很棒的 linux 系统调用编号列表,其中包含参数和所有内容,我很好奇为什么r10用于r8r9之前的参数。 我发现了各种关于什么可以用于什么以及何时使用的奇怪约定,例如循环计数器如何在rcx r10上移是否有特殊原因? 是不是更方便了?

我可能还应该提到我出于好奇而对此感兴趣,而不是因为它给我带来了问题。

编辑:我发现这个问题很接近,参考第 124 页上的 x64 ABI 文档,其中指出用户级应用程序使用rdi, rsi, rdx, rcx, r8, r9 另一方面,内核使用r10而不是rcx ,并销毁rcxr11 这或许可以解释r10如何到达那里的,但是为什么它被换入了呢?

RCXR11一起被syscall指令使用,并立即被它销毁。 因此这些寄存器不仅在 syscall 之后不会被保存,而且它们甚至不能用于参数传递。 因此选择R10来代替无法使用的RCX来传递第四个参数。

另请参阅此答案以获取有关syscall如何使用这些寄存器的更多信息。

参考: 英特尔的指令集参考,查找SYSCALL

请参阅x86-64.orgs abi 文档page 124

  1. 用户级应用程序使用整数寄存器来传递序列 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9。 内核接口使用 %rdi、%rsi、%rdx、%r10、%r8 和 %r9。

  2. 系统调用是通过 syscall 指令完成的。 内核销毁寄存器 %rcx 和 %r11。

这就是说,当您使用 syscall 指令时,内核会破坏%rcx因此您需要改用%r10


@technosaurus 的评论也解释了内核正在使用%rcx来存储入口点,以防系统调用期间发生中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM