Calling Convention的总结
来源:互联网 发布:python 逻辑与运算符 编辑:程序博客网 时间:2024/05/17 02:58
因为经常需要和不同的Calling Convention打交道,前段时间整理了一下它们之间的区别,如下:
清理堆栈
参数压栈顺序
命名规则 (MSVC++)
备注
Cdecl
调用者 (Caller)
从右往左
FuncName
因为是调用者清理Stack,因此允许变参 (如printf)
Pascal
被调用者 (Callee)
从左往右
已不再支持
__pascal, __fortran, __syscall
Stdcall
被调用者 (Callee)
从右往左
_FuncName@N
N表示所有参数大小字节数,如4
一般在Windows API和COM中使用,也是.NET和Native代码调用的缺省Calling Convention。
Fastcall (Microsoft)
被调用者 (Callee)
从右往左
@FuncName@N
N表示参数大小字节数,如4
和Stdcall类似,但是会选择两个从左往右数最先可以放在寄存器里面的参数放在ECX和EDX中
Thiscall (Microsoft)
被调用者 (Callee)
从右往左
编译器会将名字,类名,参数等编码到名字里面,具体方式和编译器相关,如:
如?Func@MyClass@@QAEXPAX@Z
基本上等价stdcall, 除了this指针用ECX传递
稍微解释一下其中不是特别明显的几个列的意义:
列
解释
清理堆栈
调用函数的时候,一般的参数都被调用者压栈(除了需要用寄存器传递的参数除外)。问题在于,谁来清理调用者压入堆栈的参数内容,是调用者还是被调用者。清理的意义是将压入的参数退栈,从机器的角度来讲则是调整堆栈指针ESP。当调用者也负责清理栈的时候,由于调用者知道实际参数的个数,因此可以正确处理变参的情况(如printf),就算是压入的参数和所期望的参数不一致也不会造成栈的不平衡,这正是printf可以很容易直接传入不同参数,而Windows API必须显式传入va_list参数(如FormatMessage)来获得变参能力的原因。
压栈顺序
参数被压栈的时候,如果有多个参数,参数可以以从左往右依次压入的顺序压入,也可以以从右往左的顺序,不同的Calling Convention之间存在区别。
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Calling Convention的总结
- Asp.net 2.0 自定义控件开发[创建自定义右键PopupMenu控件][示例代码下载]
- Asp.net 2.0 自定义控件开发[创建自定义HeaderRow的GridView控件][示例代码下载]
- ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)
- Silverlight 1.1正式更名为Silverlight 2.0
- 如何调试托管代码(managed code)和非托管代码(native code)混合的项目
- Calling Convention的总结
- .NET Main函数参数解释过程和特殊规则
- .NET/Rotor源码研究1补遗 - 解决无法检测操作系统版本的错误
- .NET SDK中CorFlags.Exe的用法
- ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型
- ZZ:使用.NET语言开发Silverlight应用程序入门(一):了解项目结构
- 微软宣布将发布.NET Framework Library源代码
- 走近Silverlight - 微软Silverlight上海开发团队Blog第二篇
- .NET中的幕后英雄:MSCOREE.DLL