|
调用约定 |
参数暂存 |
清栈 |
清栈指令 |
|
__cdecl |
右-->左入栈(this最后一个入栈) |
调用者 |
add esp,n*4; |
|
__thiscall |
右-->左入栈(ecx保存this) |
被调用者 |
ret n*4; |
|
__fastcall |
ecx,edx保存从左边开始前两个参数,右-->左入栈(ecx保存this) |
被调用者 |
ret n*4; |
|
__stdcall |
右-->左入栈(this最后一个入栈) |
被调用者 |
ret n*4; |
|
__declspec(naked) |
可与__cdecl, __thiscall, __fastcall, __stdcall连用; 在用于一般函数调用语法时,应返回代码应与相应约定一致 |
不定 |
如果函数中包含ret n*4;返回代码,则由被调用者自动清栈; 如果没有则由调用者使用add esp,n*4指令手动清栈。 |
本文详细介绍了几种常见的调用约定:__cdecl、__thiscall、__fastcall 和 __stdcall 的参数传递方式、栈清理责任方及相应的指令。此外还讨论了 __declspec(naked) 修饰符的用法及其与其他调用约定的结合使用。

215

被折叠的 条评论
为什么被折叠?



