gpt4 book ai didi

linux - x86_64 Linux syscall参数

转载 作者:行者123 更新时间:2023-12-05 00:26:16 25 4
gpt4 key购买 nike

我正在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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com