浮点型变量

来源:互联网 发布:以人为镜知得失的意思 编辑:程序博客网 时间:2024/05/01 14:13
//c++float fFloat=(float)argc;//汇编后0040e9d8 fild dword ptr [ebp+8]0040e9dbfst dword ptr [ebp-4]取出argc到ST(0)中,并将它放到 fFloat中//c++printf("%f",fFloat);//汇编后0040e9desub esp,80040e9e1fstp qword [esp];调用printf0040e9e4push offset string "%f" (0042302c)0040e9e9 call printf (0040e940)0040e9eeadd esp,0ch前两步申请空间,fstp将st0的数据存储到后面的addr中并将st0出栈。对比//c++argc=(int)fFloat;0040e9f1 fld dword ptr [ebp-4]0040e9f4call __ftol (0040e688)0040e9f9mov dword ptr [ebp+8],eax//c++printf("%d",argc)0040e9fcmov eax,dword ptr [ebp+8]0040e9ffpush eax0040ea00push offset string "%d" (0042301c)0040ea05call printf (0040e940)0040ea0aadd esp,8float 类型浮点数虽然占4字节,但都是以8字节方式进行处理。当浮点数作为参数时,并不能直接压栈。因为push指令只能传入四字节数据到栈中。浮点数作为返回值的情况也是如此,同样需要传递8字节数据。//c++fFloat = GetFloat();//0040ea3d call @ILT+5(GetFloat)  (0040100a)0040ea42fst dword ptr [ebp-4]//c++float GetFloat(){return 12.25f;;0040e9d8 fld dword ptr [__real@4@4002c400000000000000 (0042301c)]0040e9e4ret}_ftol的实现;保存环境 预留语句变量空间push ebpmov ebp,espadd esp,0F4h;浮点异常检查 cpu 与fpu同步工作waitfnstcw word ptr [ebp-2]waitmovax,word ptr [ebp-2]or ah,0chmov word ptr [ebp-4],axfldcw word ptr [ebp-4];从st0中取出8字节数据转换成整形存入ebp-0ch;将st0从栈中谈出fistp qword ptr [ecp-0ch]fldcw word ptr [ebp-2];使用eax保存长整型数据的低4字节 用于返回mov wax,dowrd ptr [ebp-0ch];使用edx保存长整型数据的高4字节 用于返回mov edx,dword ptr [ebp-8];释放栈leaveret开始部落做了一些浮点异常检查 cpu与ftp同步同坐 最后通过调用fistp来实现浮点数与证书之间的转换。由于浮点数占8个字节 而在32位下的整形只占4个字节,所以使用edx来保存多出的四字节数据。

0 0
原创粉丝点击