[英]When does Linux x86-64 syscall clobber %r8, %r9 and %r10?
[英]Linux x64: why does r10 come before r8 and r9 in syscalls?
前几天我决定尝试组装,我一直在玩非常基本的东西,比如从 argv 到 stdout 打印东西。 我发现了这个很棒的 linux 系统调用编号列表,其中包含参数和所有内容,我很好奇为什么r10
用于r8
和r9
之前的参数。 我发现了各种关于什么可以用于什么以及何时使用的奇怪约定,例如循环计数器如何在rcx
。 r10
上移是否有特殊原因? 是不是更方便了?
我可能还应该提到我出于好奇而对此感兴趣,而不是因为它给我带来了问题。
编辑:我发现这个问题很接近,参考第 124 页上的 x64 ABI 文档,其中指出用户级应用程序使用rdi, rsi, rdx, rcx, r8, r9
。 另一方面,内核使用r10
而不是rcx
,并销毁rcx
和r11
。 这或许可以解释r10
如何到达那里的,但是为什么它被换入了呢?
请参阅x86-64.orgs abi 文档page 124
用户级应用程序使用整数寄存器来传递序列 %rdi、%rsi、%rdx、%rcx、%r8 和 %r9。 内核接口使用 %rdi、%rsi、%rdx、%r10、%r8 和 %r9。
系统调用是通过 syscall 指令完成的。 内核销毁寄存器 %rcx 和 %r11。
这就是说,当您使用 syscall 指令时,内核会破坏%rcx
因此您需要改用%r10
。
@technosaurus 的评论也解释了内核正在使用%rcx
来存储入口点,以防系统调用期间发生中断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.