__cdecl, __stdcall, __fastcall

共同点: 从右向左压栈实参.
             压栈顺序: 1.压实参   2. 压EIP值   3.进入函数后, 压EBP值......

区别:
__cdecl   返回后ADD ESP, 4  (一个int参数)

__stdcall  返回前 RETN 04   (一个int参数)

__fastcall  如果只有两个参数,则不需要对ESP另作修改;   如果参数大于两个, 前两个参数仍然用EDX, ECX接收(ECX接收第一个参数), 剩余参数压栈.  返回时效仿__stdcall,  RETN 04 (第三个参数是int).  举个例子:
   //___例子____________________________________
      int __fastcall add(int a, int b, int c, int d)   //函数定义
      {
          return a+b+c+d;
      }

add(1, 2, 3, 4);    //函数调用

首先压栈4, 3
      然后MOV EDX, 2             MOV ECX, 1
      返回时只需 RETN 08  
   //___________________________________________

时间: 2024-12-05 00:17:51

__cdecl, __stdcall, __fastcall的相关文章

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) http://blog.csdn.net/kaiwii/article/details/8500686

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 2013-01-14 13:51 1548人阅读 评论(0) 收藏 举报  分类: android底层(14)  c&c++(18)  Linux下如何指定调用约定(calling convention) Windows下的调用约定可以是stdcall/cdecl/fastcall,这些标识加在函数名前面,如: int __stdcall funca() 但在Linux下,如按照上面写法后,编译程序将导

__declspec,__cdecl,__stdcall区别和作用

_cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的 顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要注意了,只有用相同的方法才能够调用成功.另外, 像printf这样接受可变个数参数的函数只有用cdecl才能够实现.      __declspec主要是用于说明DLL的引出函数的,在某些情况下用__declspec(dllexport)在DLL中生命引出函数,比用传统的 DEF文件方便一些.在普通

C and C++ Calling Convention

调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及: 函数参数通过寄存器传递还是栈? 函数参数从左到右还是从右到左压栈? 是否支持可变参数函数(vararg function or variadic function). 是否需要函数原型? 调用者(caller)还是被调用者(called or callee)清理堆栈? 在C和C++中有几种调用约定:__cdecl, __stdcall, __fastcall, __thiscall, __clrca

成员函数指针与高性能的C++委托

成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托 (delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托&

C++调用约定和名字约定

调用约定是指程序在函数调用时传递参数和获取返回值所采用的方法:通过寄存器.或通过栈.或者是两者的混合.用于指定Calling Convention的修饰符主要有:__cdecl,__stdcall,__fastcall等.调用约定可以通过工程设置:Setting...\C/C++ \Advanced\CallingConvention 项进行选择,缺省状态为__cdecl.它们决定以下内容: 1).函数参数的压栈顺序, 2).由调用者还是被调用者把参数弹出栈, 3).以及产生函数修饰名的方法.

GetProcAddress 使用注意事项

使用?GetProcAddress?Function?时,有以下几点需要特别留意: 1. 第二个参数类型是?LPCSTR,不是?: 2. 用?__declspec(dllexport),按?C?名称修饰(extern "C") 导出的函数名,对于?__stdcall?和?__fastcall?调用约定是相同的:对?__cdecl?是不同的(导出的函数名没有前面的下划线): 3. 即使返回值不是?NULL,也有可能发生错误.当 .def 模块不是连续地从 1 开始编号 ordinal 值

__stdcall,__cdecl,__fastcall的区别

__stdcall,__cdecl,__fastcall的区别 标签: dll编译器pascalclassimportinitialization 2009-12-09 15:07 10472人阅读 评论(1) 收藏 举报 分类: C/C++(22) __stdcall,__cdecl,__fastcall的区别 一.三者区别一览表 __stdcall __cdecl __fastcall 参数传递方式 右->左 压栈 右->左 压栈 左边开始的两个不大于4字节(DWORD)的参数分别放在EC

[参考]__stdcall、__cdcel和__fastcall三者的区别

一.概述 __stdcall.__cdecl和__fastcall是三种函数调用协议,函数调用协议会影响函数参数的入栈方式.栈内数据的清除方式.编译器函数名的修饰规则等. 二.调用协议常用场合  __stdcall:Windows API默认的函数调用协议. __cdecl:C/C++默认的函数调用协议. __fastcall:适用于对性能要求较高的场合. 三. 函数参数入栈方式  __stdcall:函数参数由右向左入栈. __cdecl:函数参数由右向左入栈. __fastcall:从左开始

C++知识回顾之__stdcall、__cdcel和__fastcall三者的区别

__stdcall.__cdecl和__fastcall是三种函数调用协议,函数调用协议会影响函数参数的入栈方式.栈内数据的清除方式.编译器函数名的修饰规则等. 调用协议常用场合 __stdcall:Windows API默认的函数调用协议. __cdecl:C/C++默认的函数调用协议. __fastcall:适用于对性能要求较高的场合. 函数参数入栈方式 __stdcall:函数参数由右向左入栈. __cdecl:函数参数由右向左入栈. __fastcall:从左开始不大于4字节的参数放入C