函数约定调用

函数调用约定主要约束了两件事:
  1.参数传递顺序
  2.调用堆栈由谁(调用函数或被调用函数)清理

常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

__cdecl

调用方

推入堆栈的参数,按相反的顺序 (从右向左)

__clrcall

按顺序加载在 CLR 表达式堆栈上的参数 (从左到右)。

__stdcall

被调用方

推入堆栈的参数,按相反的顺序 (从右向左)

__fastcall

被调用方

存储在注册,然后被推入堆栈

__thiscall

被调用方

推入堆栈;在 ECX 存储的 指针


着重讲一下stdcall cdecl fastcall,

stdcall 与cdecl有相同的参数传递顺序 ,参数从右向左压入堆栈,不同的是清理堆栈工作由谁完成。stdcall由调用的子函数完成,cdecl由调用的函数完成

VC中 C/C++ 默认调用约定是cdecl.

上代码,如下。

#include <stdio.h>
//__fastcall 调用
int __fastcall sum_fas(int a, int b, int c)
{
 return (a + b + c);
 } 

 //__stdcall 调用 
int __stdcall sum_std(int a, int b, int c)
{
 return (a + b + c);
 } 

//__cdecl 调用
int __cdecl sum_cde(int a, int b, int c)
{
 return (a + b + c);
 } 

//VC中 C/C++ 默认调用
int  sum (int a, int b, int c)
{
 return (a + b + c);
 } 

 int main() 
 { 
     int c1,c2,c3,c4;

     c1 = sum_fas(2, 3, 5);
     c2 = sum_std(2, 3, 5);
     c3 = sum_cde(2, 3, 5);
     c4 = sum(2,3,5);

     return 0;
 } 

 汇编代码:

int main() 
 { 
011D1500  push        ebp  
011D1501  mov         ebp,esp  
011D1503  sub         esp,0F0h  
011D1509  push        ebx  
011D150A  push        esi  
011D150B  push        edi  
011D150C  lea         edi,[ebp-0F0h]  
011D1512  mov         ecx,3Ch  
011D1517  mov         eax,0CCCCCCCCh  
011D151C  rep stos    dword ptr es:[edi]  
     int c1,c2,c3,c4;

     c1 = sum_fas(2, 3, 5);
011D151E  push        5  
011D1520  mov         edx,3  
011D1525  mov         ecx,2  
011D152A  call        sum_fas (011D1037h)  
011D152F  mov         dword ptr [c1],eax  
     c2 = sum_std(2, 3, 5);
011D1532  push        5  
011D1534  push        3  
011D1536  push        2  
011D1538  call        sum_std (011D10E6h)  
011D153D  mov         dword ptr [c2],eax  
	 c3 = sum_cde(2, 3, 5);
011D1540  push        5  
011D1542  push        3  
011D1544  push        2  
011D1546  call        sum_cde (011D10B4h)  
011D154B  add         esp,0Ch  
011D154E  mov         dword ptr [c3],eax  
	 c4 = sum(2,3,5);
011D1551  push        5  
011D1553  push        3  
011D1555  push        2  
011D1557  call        sum (011D1113h)  
011D155C  add         esp,0Ch  
011D155F  mov         dword ptr [c4],eax  

     return 0;
011D1562  xor         eax,eax  
 } 
参考:http://technet.microsoft.com/zh-cn/interopmigration/984x0h58
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值