1、堆栈:堆栈是存储器的一个区域,编译器一般使用堆栈来实现函数调用。
2、C语言的调用约定:_cdecl,_stdcall,_fastcall,naked,_pascal
C++的调用约定: _cdecl,_stdcall,_fastcall,naked,_pascal,_thiscall
3、 调用约定方式:
函数调用约定,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。
函数调用约定就是描述参数是怎样传递和由谁来平衡堆栈,以及返回值的位置。
(1) _cdecl
_cdecl又称C调用约定。是C/C++缺省的调用约定,参数按照从右向左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在eax中。
由于由调用者清理堆栈,所以允许可变参数函数存在。
(2)_stdcall
Win32API函数绝大部分是采用此调用约定,WINAPI就是_stdcall的一个别名而已。
参数按照从右向左的方式入栈,函数自身清理堆栈,返回值在eax中。
(3)_fastcall
这种调用约定特点是快。它通过CPU寄存器来传递参数,使用ecx和edx传送前两个双字,剩下的参数按照从右向左的方式入栈,函数自身清理堆栈,返回值在eax中。
(4)naked
(5)_pascal
(6)_thiscall
C++特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this指针存放与ecx中,函数自身清理堆栈。
如果参数不确定,this指针在所有参数入栈后再入栈,调用者清理堆栈
参数按照从右向左的方式入栈。