C中的调用约定

常见的几种调用约定:

调用约定参数压栈顺序平衡堆栈
__cdecl从右至左入栈调用者清理栈(谁调用,谁做堆栈平衡,也称外平栈)
__stdcall从右至左入栈自身清理堆栈 (函数内部进行堆栈平衡,也称内平栈)
__fastcallECX/EDX传送前两个自身清理堆栈(函数内部进行堆栈平衡,也称内平栈)
1、c,c++默认的调用约定
int __cdecl Plus(int a, int b)				
{				
	return a+b;			
}				

//汇编				
push        2				
push        1				
call        @ILT+15(Plus) (00401014)				
add         esp,8      //这里在函数外部进行堆栈平衡				

2、
int __stdcall Plus(int a, int b)				
{				
	return a+b;			
}				
	
//汇编			
push        2				
push        1				
call        @ILT+10(Plus) (0040100f)				
				
函数内部:							
ret         8		//这句是在call内部,即函数内部进行的堆栈平衡		

3、fastcall,参数会放在寄存器中,运算速度会非常快,如果参数超过两个,那其中一个参数就会被放入到内存中,达不到提升速度的效果。因此fastcall 只有两个参数时候才有优化效果
int __fastcall Plus(int a, int b)				
{				
	return a+b;			
}				

//汇编				
mov         edx,2				
mov         ecx,1				
call        @ILT+0(Plus) (00401005)				
				
函数内部:				  				
ret         				

4、int __fastcall Plus4(int a, int b,int c,int d)				
{				
	return a+b+c+d;			
}				
				
push        4				
push        3				
mov         edx,2				
mov         ecx,1				
call        @ILT+5(Plus) (0040100a)				
				
函数内部:							
ret         8			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值