x86_64 Linux系统调用参数

Chi*_*ins 4 x86-64 system-calls

我正在Linux上学习x86_64程序集,我遇到了一些我希望可以解决的冲突信息.一方面,我已经读过,对于syscall参数,你会按照rdi,rsi,rdx等顺序使用寄存器.但另一方面,我读过你使用寄存器rbx,rcx,rdx等.一个人告诉我,这是因为ABI的原因,但我并不完全明白这究竟意味着什么.

所以我想我要问的是,为什么这两种格式和哪种格式适合使用?

谢谢!

aug*_*rar 6

根据这个Wikibooks页面,它取决于您使用哪条指令来执行系统调用.

  • 如果你正在使用int $0x80,那么你应该使用eax的系统调用号,和ebx,ecx,edx,esi,edi,和ebp为参数(按顺序).

  • 如果您使用的syscall指令,你应该使用rax的系统调用号和rdi,rsi,rdx,r10,r8,和r9为参数.

我认为使用syscall是首选,因为它更快.

  • @Chiggins 请注意,链接中的前两个系统调用使用错误的寄存器集,只需将它们清零即可。但是零是(几乎)所有寄存器在程序入口点上的值,所以这些“异或”实际上是无操作的。这就是该程序可能适合您的原因,尽管它有时会错误地传递参数。 (3认同)