簡體   English   中英

x86_64 Linux 系統調用參數

[英]x86_64 Linux syscall arguments

我正在 Linux 上學習 x86_64 程序集,但遇到了一些我希望能夠澄清的相互矛盾的信息。 一方面,我已經讀到,對於系統調用參數,您將按照 rdi、rsi、rdx 等的順序使用寄存器。 但另一方面,我讀到您使用寄存器 rbx、rcx、rdx 等。 有人告訴我,這是因為 ABI,但我並不完全理解這究竟意味着什么。

為什么有兩種格式,哪種格式適合使用?

根據此 Wikibooks page ,這取決於您用於執行系統調用的指令。

  • 如果您使用的是int $0x80 (帶有來自asm/unistd_32.h調用號的 32 位 ABI),那么您應該使用eax作為系統調用號,使用ebxecxedxesiediebp作為參數(以該順序)。

  • 如果您使用syscall指令(帶有來自asm/unistd.h本機調用號的 64 位 ABI),您應該使用rax作為系統調用號,使用rdirsirdxr10r8r9作為參數。

i386 和 x86-64 上的 UNIX 和 Linux 系統調用的調用約定是什么

在 64 位模式下, syscall是首選,因為它更快,適用於所有 x86-64 Linux 內核,並且支持 64 位指針和整數。 例如, int 0x80 ABI 真正接受ecx輸入,而不是rcx ,例如,使其無法在 64 位代碼中writeread堆棧上的緩沖區。 如果在 64 位代碼中使用 32 位 int 0x80 Linux ABI,會發生什么? .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM