FPU 浮点数汇编

引子:

__inline float _floor(float f)
{
 static int _n;
 _asm fld f
 _asm fistp _n
 return (float)_n;
}

这个函数进行float转换

     fld是压一个浮点数入栈

     fistp是出栈。

     所以这段代码其实是用来四舍五入的。

如果你在8086编译器中编程,,上述指令无法运行,因为8086没有浮点处理器,需要协处理器。

     FPU880位 的寄存器(编号0-7),使用扩展双精度格式存储操作数。当内存中的数据载入数据寄存器时,如果数据格式不是扩展双精度格式,则在载入过程中进行格式转 换。8个寄存器组成一个循环堆栈,栈顶纪录保存于状态寄存器中,相当于堆 栈指针。每次压栈(FLD指令载入数据),堆栈指针就减1,在0-7之间循环。代码并不直接使用这个指针操作这些寄存器,而是使用ST(0)~ST(7) 表示。ST(0)指栈顶,即状态寄存器中栈顶指针指示的那个寄存器。

    fld memroy(real)  ;将存储器中的实型压入st

    fst st(num) ;复制st的值来替换st(num)的内容;只有st(num)是受到影响

    fstp st(num) ;赋值st的值来替换st(num)的内容;st出栈

0041362E  push        ecx  
0041362F  fld         dword ptr [__real@4089999a (4157B0h)] ;4.3
00413635  fstp        dword ptr [esp] ;放入栈顶
00413638  push        ecx  ;申请一个float空间
00413639  fld         dword ptr [__real@40066666 (41574Ch)] ;2.1
0041363F  fstp        dword ptr [esp] ;放入栈顶
00413642  call        test (4111DBh) 
00413647  add         esp,8 
0041364A  fstp        dword ptr [f]

浮点运算在机器中的表示:http://www.cnblogs.com/killmyday/archive/2009/03/22/1419079.html 

http://www.mouseos.com/arch/x87Environment.html

http://blog.csdn.net/jdr64/article/details/6704714

http://www1.huachu.com.cn/read/readbookinfo.asp?sectionid=1000000262

http://read.pudn.com/downloads137/sourcecode/others/584525/pdf/SimplyFPUChapter03.pdf

http://www.cnblogs.com/yzhe

http://blog.csdn.net/jdr64/article/details/6704714

http://www.mouseos.com/x64/OperandSizeAttribute.html

posted @ 2012-05-23 13:36  yarpee  阅读(756)  评论(0编辑  收藏  举报