Calling Convention的总结

EastWave应用案例:机箱屏蔽效能仿真 如何使用EastWave对机箱的电磁屏蔽效能进行仿真 阅读详情

因为经常需要和不同的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。
顺便提一下,Windows中API的Calling Convention所使用到的WINAPI宏在PC机上是__stdcall,而在WinCE上则是__cdecl,并非一成不变。

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之间存在区别。


 

CoppeliaSim学习笔记(1):建立Python脚本与CoppeliaSim的连接 CoppeliaSim学习笔记,建立python和CoppeliaSim的连接,实现联调。 阅读详情

相关推荐

图文详解Trae配置Java开发环境

本文介绍了Trae开发工具的安装配置流程:首先从官网下载安装Trae,然后安装Java开发所需的Extension Pack for Java和Spring Boot Extension Pack插件。关键步骤包括修改settings.json配置文件,需指定JDK路径、Maven可执行文件路径和用户设置文件路径。所有操作均配有图示说明,并强调要替换为实际电脑路径。

谷哥的小弟 5993

JNA调用报错lang.IllegalArgumentException: Unrecognized calling convention: 1

现象:在windows下掉用DLL正常,在linux下报错 lang.IllegalArgumentException: Unrecognized calling convention: 1         原因 :调用的命名约束不同,windows下使用stdcall,,如果没猜错,JNA的实现类继承了 StdllCallLibrary         解决方法:linux下 JNA的实现类

日月忽其不淹兮,春与秋其代序 认知即成长 7314

整理 钢琴 约翰汤普森-简易钢琴(小汤)

文件名:(小汤1)约翰-汤普森钢琴1 超清PDF (原版引进)文件名:(小汤2)约翰-汤普森钢琴2 超清PDF (原版引进)文件名:(小汤3)约翰-汤普森钢琴3 超清PDF (原版引进)文件名:(小汤4)约翰-汤普森钢琴4 超清PDF (原版引进)文件名:(小汤5)约翰-汤普森钢琴5 超清PDF (原版引进)文件大小:20.1 MB。文件大小:23.7 MB。文件大小:45.7 MB。文件大小:51.7 MB。文件大小:72.0 MB。

TS的博客 5万+

调取海康dll问题记录

海康SDK调取

weixin_48408947的博客 861

①电子产品拆解分析-暖手宝

电子产品拆解分析-暖手宝 ①按键三档调温暖手; ②长按进入氛围呼吸灯; ③安卓接口充电以及支持USB输出;

a6662580的博客 5294

一种抑制undershoot/overshoot锐化算法介绍

一、USM 当增强图像的边缘、细节信息等高频信息时,图像的锐化视觉效果会得到较大提升。提高图像锐化的一种经典算法为非锐化掩码(UNsharp Masking)技术。该技术首先通过高通滤波并与缩放系数相乘,其结果再与原始图像相加,即可对高频信息进行增强。其主要的原理如下图所示: 其中,对图像进行高通滤波的另一种等效方法为:原始图像减去原始图像的低通滤波图像,其结果被称之为“掩码”。因此,上述的USM方法可以表示为: 原始图像减去原始图像低通滤波之后的图像得到掩码M。 2.掩...

大熊 4242

几种调用约定(Calling convention)的介绍

调用约定(Calling convention):决定函数参数传送时入栈和出栈的顺序,由调用者还是被调用者把参数弹出栈,以及编译器用来识别函数名字的修饰约定。函数调用约定有多种,这里简单说一下: 1、__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,

拥抱变化 7370

第076篇:大涡模拟进阶

大涡模拟(Large Eddy Simulation, LES)是介于直接数值模拟(DNS)和雷诺平均方法(RANS)之间的重要湍流模拟方法。本文深入介绍动态Smagorinsky模型、尺度相似模型、WALE模型和隐式LES等高级亚格子模型。通过Python实现槽道湍流和圆柱绕流的LES求解器,详细展示近壁面处理、动态系数计算和亚格子应力建模技术。大涡模拟,亚格子模型,动态模型,Smagorinsky,WALE模型,尺度相似模型,近壁面处理,槽道湍流LES的核心思想是对Navier-Stokes方程进行空间

2401_87715305的博客 738

63 Java 类成员

package new20140418; /** * 类成员 * ——static 关键字修饰的成员就是类成员 * ——类成员有类Field、类方法、静态初始化块 * ——static关键字不能修饰构造器 * ——static修饰的类成员属于整个类,不属于单个实例 * @author x * */ /* * 当使用实例来访问类成员时,实际上依然是委托给该类来访问累成员, *

林彬的专栏 748

55、Mac OS X 10.2 安装、设置、卸载及故障排除全攻略

本博客全面解析了 Mac OS X 10.2 的安装、设置、卸载及故障排除方法。内容涵盖四种安装方式的适用场景及操作步骤、设置助手的详细配置流程、卸载注意事项与恢复建议,以及常见问题和进阶故障的解决办法。通过图文并茂的形式,帮助用户快速掌握 Mac OS X 10.2 的基础与高级操作,是使用该操作系统的实用指南。

qsc90123456的博客 151

调用约定(Calling convention)

调用约定(Calling convention)  钱鑫http://blog.youkuaiyun.com/lzxxteam/archive/2008/03/04/2147466.aspx  

swswsw2008的专栏 655

YOLO26-Quantized:面向国产AI芯片的全栈量化方案,适配昇腾310P与寒武纪MLU270

在算力国产化替代的行业趋势下,昇腾310P、寒武纪MLU270已成为工业边缘视觉、智能检测场景的主流国产AI芯片选型。针对原生YOLO26模型在国产芯片上推理效率低、算子兼容性差、量化精度塌陷三大核心痛点,本文提出YOLO26-Quantized全栈量化方案,覆盖训练感知量化(QAT)、离线静态量化(PTQ)、模型编译优化、芯片专属部署全流程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 762

Using WIN32 calling convention 阅读笔记

1. 本文讲述WIN32下的calling convention,也就是__cdecl, __stdcall, __fastcall这些编译器指示代码。本文所有的内容都是针对WIN32的,准确点说,是针对windows的C/C++编译器的。UNIX /Linux下基于GNU编译器的,就没有这个东西(可能是就一种calling convention吧),不过GNU编译器也有一个有趣的编译指令-...

weixin_30786617的博客 173

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

calling convention

作者:星轨(oRbIt)      E_Mail:inte2000@163.com      转载请注明原作者,否则请勿转载        使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有问题,但是链接的时候总是报告函数不存在(经典的LNK 2001错误),有时候是程序编译和链接都没有错误,但是只要调用库中的函数就会出现堆栈异常。这些现象通常是出现在C和C++的

发展是曲折的但也是前进的 4233

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux下如何指定调用约定(calling convention)

<br />Windows下的调用约定可以是stdcall/cdecl/fastcall,这些标识加在函数名前面,如:<br /> <br />int __stdcall funca()<br /> <br /> <br />但在Linux下,如按照上面写法后,编译程序将导致编译错误,Linux下正确的语法如下:<br />int __attribute__((__stdcall__)) funca()<br />int __attribute__((__cdecl__)) funca()<br /> <b

codeauth的专栏 2614

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Calling Convention

Calling Convention是指程序在函数调用时传递参数和获取返回值所采用的方法:通过寄存器、或通过栈、或者是两者的混合。 在Visual C++中,用于指定Calling Convention的修饰符主要有:__cdecl, __stdcall, __fastcall等。它们各自的特征如下: C Calling Convention __cdecl: 1> 参数按...

weixin_34417200的博客 246
上一篇: .NET Main函数参数解释过程和特殊规则
下一篇: 如何调试托管代码(managed code)和非托管代码(native code)混合的项目
ATField
博客等级 码龄25年 673粉丝 119原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值