Turbo Pascal 8087方式是什么?

8087 暂存器

8087 ***有五类暂存器,它们是堆叠暂存器(register stack)、状态字组(status word)、控制字组(control word)、标签字组(tag word)、例外指标(exception pointer)。

1.堆叠暂存器

8087 ***有八个堆叠暂存器,其名称是 ST(0)、ST(1)、ST(2)……ST(7),其中 ST(0) 被称为堆叠顶(TOS,Top Of Stack),在组合语言中也可简写成 ST。这八个堆叠暂存器每一个都有 80 位元的大小来存放浮点数,并且以暂时实数的形态存放,可以说相当的准确。有许多的运算都是会牵涉到 TOS ,有时也有 TOS 和其他堆叠暂存器做运算,所以 TOS 常常是可以省略,程式设计师得小心这种『隐含』的写法,以免造成困扰。

2.状态字组

顾名思义,这个暂存器是用来表示 8087 状态的,其结构如下图:

它包含了四项资讯。

忙碌指示器(busy indicator):在第 15 位元,这个位元表示 8087 是否正在执行命令或运算,并没太大的用处。

条件码(condition code):在第 14、10、9、8 位元,以 C3、C2、C1、C0 表示,这几个位元会受 FTST、FCOM、FXAM 等指令的影响,一般都是用来作为程式控制流程。

堆叠顶端指标:第 13、12、11 位元,这三个位元是用来指示现在的堆叠顶是那一个堆叠暂存器。

指示例外:第 7、5、4、3、2、1、0 位元,其作用如下表:

3.控制字组

这个 16 位元的暂存器决定了 8087 对不同例外条件的处理、如何舍入、控制实数精确度等等。控制字组的各个栏位如下图所示:

对於控制字组说明如下:

IEM (允许中断遮罩):0 表示允许中断,1 表示不允许中断。

PC (精确度控制):这是为了配合某些电脑厂商所制造较低精密度的机器而设的,其实在 8087 内部的堆叠暂存器都是以 80 位元的精密度存放资料。其表示方式是:

00 表示 24 位元

01 保留未使用

10 表示 53 位元

11 表示 64 位元 内定值

RC (舍入控制):第 10、11 位元是用来决定如何做舍入动作的。 RC 舍入控制 说明 例子

00 四舍五入 向最近的整数

逢四舍去,遇五进位 4.5 ==> 5

-4.5 ==> -5

01 向负无限大舍入 正值舍去小数部分

负值舍去小数部分后再减一 4.5 ==> 4

-4.4 ==> -5

10 向正无限大舍入 正值舍去小数部分后再加一

负值舍去小数部分 4.5 ==> 5

-4.5 ==> -4

11 向零舍去 不论正负值均舍去小数部分 4.5 ==> 4

-4.5 ==> -4

IC (无限大控制):8087 有两种方式可以对『无限大』与有限数作比较,一种是把正无限大与负无限大看成数线上的两端,没有数比正无限大还大,也没有数比负无限大还小,这样的方式下有限数是可以和正、负无限大比较。另一种是把正、负无限大看成同一点,相当於把数线绕合,这时有限数不可以和正、负无限大比较。前者称『affine closure』,IC 设为 1;后者称『projective closure』,IC 设为 0,这种方式也是 FINIT 后的内定值。

第 0 到第 5 位元分别是处理例外遮罩的方式,所谓例外是指 8087 运算时发生除以零、高过上限、低於下限、反常值、精确度这五种情形时,是否要让 8088 知道。如果要让 8088 知道称之为『未遮罩』(unmasked) 此时该对应位元设为零,那麼如果发生例外时,可造成程式中断而跳到设计者所设计的程式来处理。如果不使 8088 知道称为『被遮罩』,对应位元设为一,当例外发生时 8087 能自动处理,因为 8087 对各种例外可说设计得相当不错,因此内定值设为一。以下对这五种例外情形遮罩反应做说明:

除以零:ZM (zero-divide mask)位元设为零时,适当传回正无限大或负无限大。

高过上限:OM (overflow mask)位元设为零时,适当传回正无限大或负无限大。

低於下限:UM (underflow mask)位元设为零时,传回反常结果。

反常值:DM (denormalized-operand mask)位元设为零时,记忆体运算原照常工作,堆叠暂存器变成异常值。

精确度:PM (precision mask)位元设为零时,传回舍入结果。

标签字组

8087 有一个 16 位元的标签字组,标签字组裏有八个标签,每两个位元为一个标签,分别对应到八个堆叠暂存器。如下图:

每个标签代表相对应的堆叠暂存器内存入的数值形态。

00:可用数值,包含正常(normal)或异常值(unnormal)。

01:零。

10:非数值、无限大、反常值(denormal)。

11:空的。

8087 所能处理的数值资料形态,除了七种基本形态 (字组整数、短整数、长整数、短实数、长实数、暂时实数、聚集 BCD 整数) 之外,还保留了某些特殊的编码方式来表示特殊的资料,这些特殊的资料一般应用上较少使用,在这儿简单说明:

反常值(denormal):

异常值(unnormal):

零:

虚零(pseudo zero):

无限大:

实数未定值(real indefinit):

非数值(not a number):