我正在Linux上学习x86_64程序集,遇到了一些我希望可以清除的冲突信息。一方面,我已经阅读了有关syscall参数的信息,您将按rdi,rsi,rdx等顺序使用寄存器。但是另一方面,我读到您使用了寄存器rbx,rcx,rdx等。有人告诉我,这样做的原因是因为ABI,但是我并不完全理解那是什么意思。
为什么要使用两种格式,哪种才是正确的格式?
最佳答案
根据this Wikibooks page,这取决于您用于执行syscall的指令。
int $0x80
(具有来自asm/unistd_32.h
的调用号码的32位ABI),则应使用eax
作为系统调用号码,并使用ebx
,ecx
,edx
,esi
,edi
和ebp
作为参数(按顺序排列) 。syscall
指令(具有来自asm/unistd.h
的本地调用号的64位ABI),则应将rax
用作系统调用号,并将rdi
,rsi
,rdx
,r10
,r8
和r9
用作参数。What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
在64位模式下,首选
syscall
,因为它速度更快,可在所有x86-64 Linux内核上使用,并且支持64位指针和整数。例如,int 0x80
ABI真正以ecx
而非rcx
接受输入,从而使其无法用于64位代码的堆栈上缓冲区的write
或read
。What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?。
关于linux - x86_64 Linux syscall参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22444526/