探讨c++函数中的参数传递与返回值(四) 浮点型值的参数传递与返回值

第四章 浮点型值的参数传递与返回值

浮点型值做参数和返回值的处理跟简单型值基本一致,区别在于:

1. 浮点型值参数拷贝到栈的操作需要浮点寄存器的支持;

  先为浮点型值参数预留栈空间,float 4字节, double 8字节,使用push或sub esp,N指令,再使用fld和fstp指令,将实参的值拷贝到栈上空间。

2. 浮点型值做返回值,不是用eax传出返回值,而是用浮点寄存器ST0。

3. 浮点型值做返回值,在外部接收返回值的时候使用fstp指令。

综上,浮点型值参数的拷贝过程,实参->ST0,ST0->形参;

           浮点型值做返回值的拷贝过程,要返回其值的变量->ST0, ST0->返回值接收者。

测试代码:

1.float

  	float a=fn1(5.0); //main函数中的相应调用
0041173A  push        ecx                   ;为参数预留栈空间
0041173B  fld         dword ptr [__real@40a00000 (4167E0h)] ;st0 = 5.0 ;
00411741  fstp        dword ptr [esp]       ;arg1 = st0;  
00411744  call        fn1 (41100Ah)         ;st0 = fn1();
00411749  add         esp,4 			 ;平衡堆栈
0041174C  fstp        dword ptr [ebp-2Ch]  ;a = st0
	…
	return temp;	//fn1函数中的部分
00411430  fld         dword ptr [temp (418140h)]  ;返回值存储在ST0中
2.double
	double da = dn1(5.0);	// main函数中的相应调用
004117BF  sub         esp,8 				;为参数预留栈空间
004117C2  fld         qword ptr [__real@4014000000000000 (416778h)] ;st0 = 5.0 ;
004117C8  fstp        qword ptr [esp] 		;arg1 = st0;
004117CB  call        dn1 (4111FEh) 			;st0 = fn1();
004117D0  add         esp,8 				;平衡堆栈
004117D3  fstp        qword ptr [ebp-3Ch]		;a = st0
	…
	return dTmp;		//dn1函数中的部分
00411550  fld         qword ptr [dTmp (4184A8h)]	;返回值存储在ST0中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值