加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux x64:为什么r10来自系统调用中的r8和r9?

发布时间:2020-12-14 01:04:48 所属栏目:Linux 来源:网络整理
导读:前几天我决定在组装时采取行动,我一直在玩基本的东西,比如从argv到stdout的打印.我发现 this great list of linux syscall numbers带有参数和所有内容,我很好奇为什么r10用于r8和r9之前的参数.我已经找到各种奇怪的约定,关于什么可以用于什么和什么时候,比如
前几天我决定在组装时采取行动,我一直在玩基本的东西,比如从argv到stdout的打印.我发现 this great list of linux syscall numbers带有参数和所有内容,我很好奇为什么r10用于r8和r9之前的参数.我已经找到各种奇怪的约定,关于什么可以用于什么和什么时候,比如循环计数器如何在rcx中使用.是否有一个特殊原因导致r10向上移动?它更方便吗?

我可能也应该提到我出于好奇而对此感兴趣,而不是因为它引起了我的问题.

编辑:我发现this question接近,参考第124页的the x64 ABI documentation,其中注意到用户级应用程序使用rdi,rsi,rdx,rcx,r8,r9.另一方面,内核使用r10而不是rcx,并破坏rcx和r11.这可能解释了r10如何在那里结束,但那么为什么它会被换入?

解决方法

RCX和R11由syscall指令使用,立即被它破坏.因此,这些寄存器不仅不会在系统调用之后保存,而且甚至不能用于参数传递.因此,选择R10来替换不可用的RCX以传递第四参数.

有关syscall如何使用这些寄存器的更多信息,另请参见this answer.

参考:Intel’s Instruction Set Reference,寻找SYSCALL.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读