ZOS 之 浮点数寄存器

浮点执行环境的寄存器主要是8个通用数据寄存器和几个专用寄存器,它们是状态寄存器、控制寄存器、标记寄存器等。

FPU浮点数计算系统(浮点处理单元): 8个80位浮点寄存器,16位状态寄存器,16位控制寄存器,16位标识寄存器。

8个浮点数据寄存器(FPU Data Register),编号FPR0 ~ FPR7。每个浮点寄存器都是80位的,以扩展精度格式存储数据。当其他类型数据压入数据寄存器时,PFU自动转换成扩展精度;相反,数据寄存器的数据取出时,系统也会自动转换成要求的数据类型。8个浮点数据寄存器组成首尾相接的堆栈,当前栈顶ST(0)指向的FPRx由状态寄存器中TOP字段(16位中的某3位)指明。数据寄存器按照“后进先出”的堆栈原则工作,并且首尾循环。

向数据寄存器传送(Load)数据时就是入栈,堆栈指针TOP先减1(从高位向低位压数据),再将数据压入栈顶寄存器;

从数据寄存器取出(Store)数据时就是出栈,先将栈顶寄存器数据弹出,再修改堆栈指针使TOP加1。从低位到高位弹出数据,弹数据是正顺序的

浮点寄存器栈有首尾循环相连的特点。例如,若当前栈顶TOP=0(即ST(0) = PFR0),那么,入栈操作后就使TOP=7(即使ST(0) = PFR7),数据被压入PFR7。所以,浮点数据寄存器常常被称为浮点数据栈。

为了表明浮点数据寄存器中数据的性质,对应每个FPR寄存器,都有一个2位的标记(Tag)位,这8个标记tag0 ~ tag7组成一个16位的标记寄存器。

浮点处理单元FPU具有自己的指令系统,共有几十种浮点指令,可以分成传送、算术运算、超越函数、比较、FPU控制等类。浮点指令归属于ESC指令,其前5位的操作码都是11011b,它的指令助记符均以F开头。

1. 浮点传送类指令

    浮点数据传送指令完成主存与栈顶st(0)、数据寄存器st(i)与栈顶之间的浮点格式数据的传送。浮点数据寄存器是一个首尾相接的堆栈,所以它的数据传送实际上是对堆栈的操作,有些要改变堆栈指针TOP,即修改当前栈顶。类似于push,pull

2. 算术运算类指令

    这类浮点指令实现浮点数、16/32位整数的加、减、乘、除运算,它们支持的寻址方式相同。这组指令还包括有关算术运算的指令,例如求绝对值、取整等。

3. 超越函数类指令

    浮点指令集中包含有进行三角函数、指数和对数运算的指令。

4. 浮点比较类指令

    浮点比较指令比较栈顶数据与指定的源操作数,比较结果通过浮点状态寄存器反映。

5. FPU控制类指令

    FPU控制类指令用于控制和检测浮点处理单元FPU的状态及操作方式。

采用浮点指令的汇编语言程序格式,与整数指令源程序格式是类似的,但有以下几点需要注意:

·  定义浮点数据

      我们知道,数据定义伪指令dd(dword) / dq(qword) / dt(tbyte)依次说明32/64/80位数据;它们可以用于定义单精度、双精度和扩展精度浮点数。

·  初始化浮点处理单元

      每当执行一个新的浮点程序时,第一条指令都应该是初始化FPU的指令finit。该指令清除浮点数据寄存器栈和异常,为程序提供一个“干净”的初始状态。否则,遗留在浮点寄存器栈中的数据可能会产生堆栈溢出。另一方面,浮点指令程序段结束,也最好清空浮点数据寄存器。

FPU有8个独立的、可寻址的80位数据寄存器R0-R7,如下图所示,这些寄存器合称为寄存器栈。FPU 状态字中名为 TOP 的一个 3 位字段给出了当前处于栈顶的寄存器编号。例如,在下图中,TOP 等于二进制数 011,这表示现在栈顶为 R3。在编写浮点指令时,这个位置也称为 ST(0)(或简写为 ST)。最后一个寄存器为 ST(7)。
在这里插入图片描述

注意:

  • ST(0)总表示栈顶
  • 如果加载到堆栈的数值覆盖了寄存器栈内原有的数据,就会产生一个浮点异常 

https://blog.csdn.net/qq_41683305/article/details/104210454

每日小常识:

 在计算机中,实数的浮点格式(Floating-Point Format)所示,分成指数、有效数字和符号位三个部分。

·  符号(Sign)——表示数据的正负,在最高有效位(MSB)。负数的符号位为1,正数的符号为0。

·  指数(Exponent)——也被称为阶码,表示数据以2为底的幂。指数采用偏移码(Biased Exponent)表示,恒为整数。

·  有效数字(Significand)——表示数据的有效数字,反映数据的精度。有效数字一般采用规格化(Normalized)形式,是一个纯小数,所以也被称为尾数(Mantissa)、小数或分数(Fraction)。

80x87支持三种浮点数据类型:单精度、双精度和扩展精度;它们的长度依次为32、64和80位,即4、8和10个字节;它们遵循美国IEEE(电子电气工程师协会)定义的国际标准浮点格式。

·  单精度浮点数(32位短实数)——由1位符号、8位指数、23位有效数组成。

·  双精度浮点数(64位长实数)——由1位符号、11位指数、52位有效数组成。

·  扩展精度浮点数(80位临时实数)——由1位符号、15位指数、64位有效数组成。很多计算机中并没有80位扩展精度这种数据类型,80x87 FPU主要在内部使用它存贮中间结果,以保证最终数值的精度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值