几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall

2024-03-01 10:08

本文主要是介绍几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall

参考

下表内容整理自:ms-help://embarcadero.rs2010/rad/C++_Compiler.html

 

 

__pascal

Pascal(-p)

__cdecl

C(-pc)

__msfastcall

__msfastcall(-pm)

__fastcall

Fastcall(register)(-pr)

__stdcall

Stdcall(-ps)

Generate underbars

no

yes

 

 

no

Case sensitive

All uppercase

yes

 

 

Preserve case

Who cleans stack

Calling function

 

 

 

Called function

Push parameters

Left to right

Right to left

 

Passed in registers

Right to left

Must pass the correct number 

and type of arguments

yes

 

 

 

yes

Take varible parameter list

 

yes

 

 


 

 

下表内容整理自:http://blog.csdn.net/jia_xiaoxin/article/details/2868216

 

 

__pascal

 

__cdecl

 

__fastcall

 

__stdcall

 

__thiscall

生成修饰名

 

输出函数名前加上一个下划线前缀,格式为_functionname

在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@functionname@number

在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number。如函数int func(int a, double b)的修饰名是_func@12

 

Who cleans stack

由被调用者清除

由调用者把参数弹出栈

被调用的函数在返回前清理传送参数的内存栈

由被调用者把参数弹出栈

 

Push parameters

从左向右传递参数

从右至左的顺序压参数入栈

实际上,它用ECXEDX传送前两个双字(DWORD)或更小的参数,第一个参数进ECX,第2个进EDX剩下的参数仍旧自右向左压栈

从右至左的顺序压参数入栈

参数从右到左压

返回值

通过EAX返回

EAX

EAX

EAX

 

备注

 

 

主要特点就是快

Pascal程序的缺省调用方式

仅仅应用于"C++"成员函数。this指针存放于CX寄存器,thiscall不是关键词,因此不能被程序员指定

C编译时函数名修饰约定规则

 

_functionname

@functionname@number

_functionname@number

 

C++编译时函数名修饰约定规则

 

规则同_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"

规则同_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"

1)、以"?"标识函数名的开始,后跟函数名;
2)、函数名后面以"@@YG"标识参数表的开始,后跟参数表;
3)、参数表以代号表示:
X--void 
D--char
E--unsigned char
F--short
H--int
I--unsigned int
J--long
K--unsigned long
M--float
N--double
_N--bool
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复;
4)、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前; 
5)、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。
其格式为"?functionname@@YG*****@Z""?functionname@@YG*XZ",例如
          int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”
          void Test2()                       -----“?Test2@@YGXXZ

 

 

 







这篇关于几种调用协议的区别__pascal __cdecl __msfastcall __fastcall __stdcall的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/762070

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们