第四章 浮点型值的参数传递与返回值
浮点型值做参数和返回值的处理跟简单型值基本一致,区别在于:
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中