[英]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
作為系統調用號,使用ebx
、 ecx
、 edx
、 esi
、 edi
和ebp
作為參數(以該順序)。
如果您使用syscall
指令(帶有來自asm/unistd.h
本機調用號的 64 位 ABI),您應該使用rax
作為系統調用號,使用rdi
、 rsi
、 rdx
、 r10
、 r8
和r9
作為參數。
i386 和 x86-64 上的 UNIX 和 Linux 系統調用的調用約定是什么
在 64 位模式下, syscall
是首選,因為它更快,適用於所有 x86-64 Linux 內核,並且支持 64 位指針和整數。 例如, int 0x80
ABI 真正接受ecx
輸入,而不是rcx
,例如,使其無法在 64 位代碼中write
或read
堆棧上的緩沖區。 如果在 64 位代碼中使用 32 位 int 0x80 Linux ABI,會發生什么? .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.