GCC的调用约定
- IA-32
在32位的体系结构中,有3种调用约定,分别是cdecl
,stdcall
,fastcall
,GCC的默认调用约定为cdecl
。参数从右向左压栈,调用者负责在调用后清理堆栈,返回值保存在eax寄存器中,非易失寄存器为ebp
,esp
,ebx
,esi
,edi
。
参考 C Calling Convention
X86上的一些调用惯例需要通过栈来传递参数,对于X64来说,多数调用惯例都是通过寄存器来传递参数。
- X86-64
x64的调用约定只有一种,遵守system v ABI的规范。但是Linux和windows却有一些差别。在windows X64中,前4个参数通过rcx
,rdx
,r8
,r9
来传递,其余的参数按照从右向左的顺序压栈。在Linux上,则是前6个参数通过rdi
,rsi
,rdx
,rcx
,r8
,r9
传递,其余的参数按照从右向左的顺序压栈。
更详细的信息参考另一篇文章 system V ABI