浮点栈结构剖析.ppt

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
浮点栈结构剖析

浮点栈结构 FPU中包含一个浮点寄存器栈,它包含了8个80位的可以直接进行浮点运算的寄存器,浮点数以双精度格式存储在这些寄存器中,无论是单精度、双精度还是整数等,被load到这些个寄存器中后,都会转化为双精度。FPU指令在使用这些寄存器的时候,是以一种“栈”的方式来使用,叫做“浮点寄存器栈”,其结构如下图所示: 这个栈由8个可以直接进行浮点运算的寄存器组成,按照顺序编号为0-7。CPU在处理浮点运算的时候,将这些寄存器作为一个栈来使用。它是一个向下扩展的循环栈。我们知道,整点运算有个FLAG状态寄存器,同样,浮点运算部件中也有个浮点状态寄存器FFLAG,处理器利用浮点状态寄存器中的bit11-bit13三个bit来标记这个栈的栈顶位置(用top指针表示)。 浮点栈的工作原理 当程序向寄存器栈中装入数据的时候,top指针的值减1,然后将数据压入top指针指向的浮点寄存器中。 当top值为0的时候,下一次压栈则将数据压入7号浮点寄存器中,top指针被设置成7(也就是说浮点栈是一个循环栈)。 当需要将堆栈中的数据保存到内存中的时候(FST指令),则进行退栈操作。退栈操作与压栈类似,top指针增加1,若退栈前top值为7,则退栈后top为0(对于X87寄存器来说,一个load操作相当于push,一个store操作相当于pop)。 按照下面的逻辑,是不是只能够使用栈顶的浮点寄存器呢? 上述这些操作由硬件来完成,对用户是透明的,用户无须关心压栈和出栈操作以及top值这些细节,FPU提供了FLD,FST等访存指令和FADD等浮点运算指令以及其他一些辅助指令来操作浮点寄存器(可参考IA_32指令集手册)。用户可以通过FLD指令将内存中的浮点数据压入浮点寄存器栈,通过FADD指令进行一个加法运算,然后通过FST指令来保存结果并退栈。 用户通过指令对浮点数据操作的时候,这些浮点寄存器所呈现给用户的名字是ST[0],ST[1],ST[2]......ST[7]。但是,要注意,这里的ST[i]中的i并不是和上图中的编号一一对应的,而是离栈顶的距离。也就是说,ST[i]表示距离栈顶的第i个单元的寄存器。按照上面的图所示的状态,ST[0]为第3号寄存器,ST[1]为第4号寄存器,以此类推。 具体使用例子 FLD value1 ;(a) value1=5.6 FMUL value2 ;(b) value2=2.4 FLD value3 ; value3=3.8 FMUL value4 ;(c)value4=10.3 FADD ST(1) ;(d) 实际上,这些指令是完成了一个这样的操作: double Product = (5.6 x 2.4) + (3.8 x 10.3); 第一条指令(FLD value1)将top指针减1(压栈),将值5.6 从内存load到ST[0]寄存器,如下面的图中(a)所示。 第二个指令将ST(0)同内存中的valua2(2.4)相乘,并将结果存在ST[0]中。如(b)所示。 第三条指令将top减1,并将3.8 load到ST[0]中。 第四条指令将ST[0]中的值同内存中的value4(10.3)相乘,并将结果存储在ST[0]中,如(c)所示。 第五条指令将ST[0]中的值同ST[1]中的值相加,把结果存放到ST[0]中,如(d)所示。 几个问题 溢出怎么办?怎么防止栈顶覆盖栈底呢?对空栈退栈操作和对满栈入栈操作可以吗? FPU还提供了一个标记寄存器tag,这个寄存器记录了每个浮点寄存器的状态,当装入数据的时,硬件会将寄存器中相应的tag置为有效,反之置为空。当压栈时遇到已经标为有效的寄存器时,产生上溢;如果退栈时,遇到相应tag为空时,则产生下溢,处理器会触发相应的异常来进行处理。 * *

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档