函数的调用方式

  1. PASCAL调用方式,__stdcall(CALLBACK,WINAPI,PASCAL),使用PASCAL调用方式,函数在返回到调用者之前将参数从栈中删除,WinMain函数是由系统调用的,Windows系统规定由系统调用的函数都遵守PASCAL调用方式
  2. C调用方式,__cdecl,使用C调用方式,参数的删除是调用者完成的,VC中函数的缺省调用方式是__cdecl,也就是C调用方式

stdcall,CALLBACK,WINAPI

  1. 参数从右向左依次压入堆栈
  2. 由被调用函数自己来恢复堆栈
  3. 函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸

     //push b 先压入第二个参数
     //push a 再压入第一个参数
     //call function 调用函数
     //在编译时,此函数的名字被翻译为_function@8
     int _stdcall function(int a, int b);
    

cdecl

decl调用方式又称为C调用方式,是C语言缺省的调用方式,它的语法为:

int function(int a, int b) // 不加修饰符就是C调用方式
int _cdecl function(int a, int b) // 明确指定用C调用方式
  1. 参数从右向左依次压入堆栈
  2. 由调用者恢复堆栈, 由于是由调用者来恢复堆栈,因此C调用方式允许函数的参数个数是不固定的,这是C语言的一大特色
  3. 函数名自动加前导下划线

     //push b 先压入第二个参数
     //push a 在压入第一个参数
     //call funtion 调用函数
     //add esp, 8 清理堆栈 。。。。。需要熟悉一下esp寄存器的功能,建议看一下汇编有关的书,基本都有讲
     //在编译时,此方式的函数被翻译成:_function