我正在Linux上学习x86_64程序集,遇到了一些我希望可以清除的冲突信息。一方面,我已经阅读了有关syscall参数的信息,您将按rdi,rsi,rdx等顺序使用寄存器。但是另一方面,我读到您使用了寄存器rbx,rcx,rdx等。有人告诉我,这样做的原因是因为ABI,但是我并不完全理解那是什么意思。
为什么要使用两种格式,哪种才是正确的格式?

最佳答案

根据this Wikibooks page,这取决于您用于执行syscall的指令。

  • 如果您使用的是int $0x80(具有来自asm/unistd_32.h的调用号码的32位ABI),则应使用eax作为系统调用号码,并使用ebxecxedxesiediebp作为参数(按顺序排列) 。
  • 如果使用的是syscall指令(具有来自asm/unistd.h的本地调用号的64位ABI),则应将rax用作系统调用号,并将rdirsirdxr10r8r9用作参数。

  • 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位代码的堆栈上缓冲区的writeread
    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/

    10-14 18:36
    查看更多