FPU 浮点数汇编

摘要:
所以这个代码实际上用于舍入。如果在8086编译器中编程,则无法运行上述指令,因为8086没有浮点处理器,需要协处理器。FPU有八个80位寄存器,以扩展双格式存储操作数。八个寄存器组成一个循环堆栈。堆栈记录的顶部保存在状态寄存器中,状态寄存器相当于堆栈指针。每次按下堆栈时,堆栈指针减少1,并在0和7之间循环。代码不直接使用此指针对这些寄存器进行操作,而是使用ST~ST表示。

引子:

__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

免责声明:文章转载自《FPU 浮点数汇编》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux内核编译环境配置Linux性能监控下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

爬虫——爬虫模块的基本使用+获取post,get,ajax方式加载的网页的数据

一、爬虫如何抓取网页数据:网页三大特征:  -1. 网页都有自己唯一的URL(统一资源定位符)来进行定位  -2. 网页都使用HTML (超文本标记语言)来描述页面信息。  -3. 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据。爬虫的设计思路:  -1. 首先确定需要爬取的网页URL地址。  -2. 通过HTTP/HTTP协议来获取...

STL之stack栈

概述 栈(statck)这种数据结构在计算机中是相当出名的。 栈中的数据是先进后出的(First In Last Out, FILO)。栈只有一个出口,允许新增元素(只能在栈顶上增加)、移出元素(只能移出栈顶元素)、取得栈顶元素等操作。 在STL中,栈是以别的容器作为底部结构,再将接口改变,使之符合栈的特性就可以了。因此实现非常的方便。 namespace...

区间合并

给定 n 个区间 [li,ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3]和[2,6]可以合并为一个区间[1,6]。 输入格式第一行包含整数n。 接下来n行,每行包含两个整数 l 和 r。 输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。 数据范围1 ≤ n ≤ 100000,...

JLINK、ULINK和STlink仿真器详解

JLink仿真器 德国SEGGER公司推出基于JTAG的仿真器。简单地说,是给一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议。它完成了一个从软件到硬件转换的工作。 ULINK仿真器 现在普遍用到的是ULINK2,它是ARM公司最新推出的配套RealViewMDK使用的仿真器,是...

浅析State-Thread

State-Thread(以下简称st),是一个由C语言编写的小巧、简洁却高效的开源协程库。这个库基于单线程运作、不强制占用用户线程,给予了开发者最大程度的轻量级和较低的侵入性。本篇文章中,网易云信音视频研发大神将为大家简要分析State-Thread,欢迎大家积极留言,和我们共同讨论。 在开始这个话题之前,我们先来聊一聊协程。 什么是协程? 协程是一种程...

Mysql 批处理多条sql语句

package cn.itcast.demo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; import cn.it...