引子:
__inline float _floor(float f) { static int _n; _asm fld f _asm fistp _n return (float)_n; }
这个函数进行float转换
fld是压一个浮点数入栈
fistp是出栈。
所以这段代码其实是用来四舍五入的。
如果你在8086编译器中编程,,上述指令无法运行,因为8086没有浮点处理器,需要协处理器。
FPU有8个80位 的寄存器(编号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://blog.csdn.net/jdr64/article/details/6704714
http://www.mouseos.com/x64/OperandSizeAttribute.html