cdecl调用约定 #
■ cdecl调用约定的参数压栈顺序与stdcall相同,皆是按照从右向左的顺序将参数压入栈中。
■ 函数的栈平衡操作是由调用函数完成的,这点与stdcall恰恰相反。stdcall 调用约定使用代码retn x平衡栈,而cdecl调用约定则通常会借助代码leave、 pop或向上移动栈指针等方法来平衡栈。
■ 每个函数调用者都含有平衡栈的代码,因此编译生成的可执行文件会较 stdcall调用约定生成的文件大。
cdecl是GNU C编译器的默认调用约定。但GNU C在64位系统环境下,却使用寄存器作为函数参数的传递方式。函数调用者按照从左向右的顺序依次将前6个整型参数放在通用寄存器RDI、RSI、RDX、RCX、R8和R9中;同时,寄存器XMM0~XMM7 用来保存浮点变量,而RAX寄存器则用于保存函数的返回值,函数调用者负责平衡栈。
From #
一个64位操作系统的设计与实现