简单说明 __cdecl、__stdcall和__fastcall
2017-11-20 15:25
337 查看
__cdecl的特点
__cdecl 是 C Declaration 的缩写,表示 C 和 C++ 默认的函数调用约定。是C/C++和MFCX的默认调用约定。按从右至左的顺序压参数入栈、。
由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的,返回值在EAX中。因此对于像printf这样可变参数的函数必须用这种约定。
编译器在编译的时候对这种调用规则的函数生成修饰名的时候,在输出函数名前加上一个下划线前缀,格式为_function。如函数int add(int a, int b)的修饰名是_add。
__stdcall的特点
__stdcall是Standard Call的缩写,是C++的标准调用方式,当然这是微软定义的标准,__stdcall通常用于Win32 API中(可查看WINAPI的定义)。按从右至左的顺序压参数入栈。
由被调用者把参数弹出栈。切记:函数自己在退出时清空堆栈,返回值在EAX中。
__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_function@number。如函数int sub(int a, int b)的修饰名是_sub@8。
__fastcall的特点
__fastcall调用的主要特点就是快,因为它是通过寄存器来传送参数的。__fastcall和__stdcall很象,唯一差别就是头两个参数通过寄存器传送。注意通过寄存器传送的两个参数是从左向右的。_cdecl、_stdcall、__fastcall三者之间的区别:
要点 | __cdecl | __stdcall | __fastcall |
参数传递方式 | 右->左 | 右->左 | 左边开始的两个不大于4字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数自右向左压栈传送 |
清理栈方 | 调用者清理 | 被调用函数清理 | 被调用函数清理 |
适用场合 | C/C++、MFC的默认方式; 可变参数的时候使用; | Win API | 要求速度快 |
C编译修饰约定 | _functionname | _functionname@number | @functionname@number |
相关文章推荐
- _stdcall,_cdecl,_fastcall 详细说明
- 函数调用约定:_stdcall、_cdecl、_fastcall
- _stdcall,_cdecl,_fastcall 详细说明
- __stdcall, __cdecl和__fastcall
- __stdcall,__cdecl,__fastcall
- 转:__stdcall、__cdecl与__fastcall
- The usage of __Stdcall, __cdecl, thiscall and __fastcall
- __cdecl, __stdcall, __fastcall
- 函数调用约定:_stdcall,_cdecl,_fastcall
- 汇编学习第五课之函数调用约定:cdecl,stdcall,fastcall
- _stdcall,_cdecl,_fastcall 详细说明
- _stdcall _cdecl _pascal _fastcall
- cdecl、pascal、stdcall、fastcall
- __cdecl,__stdcall和__fastcall
- _stdcall,_cdecl,_fastcall 详细说明
- __cdecl __fastcall与 __stdcall的说明(转)
- _stdcall _cdecl _pascal _fastcall
- __cdecl __stdcall PASCAL __fastcall
- C/C++中函数调用规则(约定)__cdecl __stdcall __thiscall __vectorcall __fastcall
- __cdecl __stdcall __fastcall