Calling Convention的总结

news/2024/7/2 22:13:22

因为经常需要和不同的Calling Convention打交道,前段时间整理了一下它们之间的区别,如下:

 

清理堆栈

参数压栈顺序

命名规则 (MSVC++)

备注

Cdecl

调用者 (Caller)

从右往左 

FuncName

因为是调用者清理Stack,因此允许变参 (printf)

Pascal

被调用者 (Callee)

从左往右 

已不再支持

__pascal, __fortran, __syscall

Stdcall

被调用者 (Callee)

从右往左

_FuncName@N

N表示所有参数大小字节数,如4

一般在Windows APICOM中使用,也是.NETNative代码调用的缺省Calling Convention。
顺便提一下,Windows中API的Calling Convention所使用到的WINAPI宏在PC机上是__stdcall,而在WinCE上则是__cdecl,并非一成不变。

Fastcall (Microsoft)

被调用者 (Callee)

从右往左

@FuncName@N

N表示参数大小字节数,如4

Stdcall类似,但是会选择两个从左往右数最先可以放在寄存器里面的参数放在ECXEDX

Thiscall (Microsoft)

被调用者 (Callee)

从右往左

编译器会将名字,类名,参数等编码到名字里面,具体方式和编译器相关,如:

 

?Func@MyClass@@QAEXPAX@Z

基本上等价stdcall, 除了this指针用ECX传递

 

 

 

 

 

 

稍微解释一下其中不是特别明显的几个列的意义:

解释

清理堆栈

调用函数的时候,一般的参数都被调用者压栈(除了需要用寄存器传递的参数除外)。问题在于,谁来清理调用者压入堆栈的参数内容,是调用者还是被调用者。清理的意义是将压入的参数退栈,从机器的角度来讲则是调整堆栈指针ESP。当调用者也负责清理栈的时候,由于调用者知道实际参数的个数,因此可以正确处理变参的情况(如printf),就算是压入的参数和所期望的参数不一致也不会造成栈的不平衡,这正是printf可以很容易直接传入不同参数,而Windows API必须显式传入va_list参数(如FormatMessage)来获得变参能力的原因。

压栈顺序

参数被压栈的时候,如果有多个参数,参数可以以从左往右依次压入的顺序压入,也可以以从右往左的顺序,不同的Calling Convention之间存在区别。


 





http://www.niftyadmin.cn/n/3658056.html

相关文章

如何调试托管代码(managed code)和非托管代码(native code)混合的项目

在调试同时存在托管代码和非托管代码的程序的时候,需要特别注意选用适当的调试器的类型。因为看到类似的问题问得比较多,因此这里把做法写出来。在托管项目中在调试之前,需要打开对非托管代码调试的功能,这个选项在项目的属性的De…

NLP学习笔记(2)

如果你的数据集比较小,最好不要自己训练词向量,容易过拟合,直接download别人在某些语料库上训练好的词向量fix下来比较好但是如果你的数据集比较大,你可以随机初始化你的词向量并且在训练过程中训练他们window classification是最…

Silverlight 1.1正式更名为Silverlight 2.0

详情请参看下面两篇Blog:http://weblogs.asp.net/scottgu/archive/2007/11/29/net-web-product-roadmap-asp-net-silverlight-iis7.aspxhttp://blogs.msdn.com/tims/archive/2007/11/29/silverlight-1-1-is-now-silverlight-2-0.aspx

FPN阅读笔记

Feature Pyramid Networks for Object Detection arxiv链接:https://arxiv.org/pdf/1612.03144v2.pdf 网络结构示意图 核心思想是,高级语义信息在靠后的feature map,但是分辨率太小,导致小物体的特征几乎没有了,分辨…

ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)

学习整理了一下(一).功能用HttpHandler实现图片验证码(二).代码如下1. 处理程序文件 ValidateImageHandler.ashx代码如下1 <% WebHandler Language"C#"Class"ValidateImageHandler"%>2 3 usingSystem;4 usingSystem.Web;5 usingSystem.Web.SessionSt…

NLP学习笔记(3)

NMT&#xff08;nerual machine translation&#xff09;任务经常被描述为一个encode-decode过程&#xff0c;输入序列利用RNN进行encode产生一个编码&#xff08;包含句子的语义信息&#xff09;&#xff0c;将这个编码送进decode的RNN产生target的语言序列&#xff0c;这就完…

NLP学习笔记(4)

不要在RNN的水平方向使用dropout&#xff08;虽然有人这么做&#xff0c;但是是用特殊的方法的&#xff09;&#xff0c;但是经常在垂直方向使用dropout初始化参数的时候&#xff0c;LSTM的forget gate的bias给1或2确保不会一开始就遗忘&#xff0c;然后其它的参数要初始化为很…

Asp.net 2.0 自定义控件开发[创建自定义HeaderRow的GridView控件][示例代码下载]

(一). 概述1. 做了个GridViewExtend自定义控件, 通过注册扩展自定义表头事件, 可以任意设置Header的格式.2. 易重用代码, 只要将ExtendGridView.dll 文件添加到项目引用即可. 实现原理&#xff1a;增加一个自定义事件&#xff0c;并将GridView头(HeaderRow)引用作为事件参数…