第11章 数值运算协处理器
数值运算协处理器 (简称协处理器)是特为与微处理器协同工作而设计的,它是用于加速处理浮点数据的处理部件。对同样的浮点计算,使用该部件进行运算所花的执行时间要比用常 规指令编写的最有效代码所花的时间还要少得多。在早期的计算机系统中,该部件是可选部件,但现在一般都把协处理器直接内置在CPU之中。鉴于现在 Pentium处理器内部结构的特点,该处理器能同时执行一条协处理器指令和二条整数指令。
协处理器的主要产品序列有:8087、80287、80387SX、80387DX和80487SX等。
协处理器可处理的数据类型有:16位、32位和64位有符号整数,18位BCD码,32位、64位和80位浮点数。
协处理器可处理的运算有:乘法、除法、加法、减法、求平方根、部分正切、部分反正切和对数等运算。
11.1 协处理器的数据格式
在第4章,我们主要介绍了整数在内存中的存储形式,这显然不能满足实际编程的需要。数据类型的另一大类就是浮点数,浮点数在内存中的存储形式就是本节所介绍的主要内容。有关浮点数的存储格式在《计算机组成原理》中的有关章节也有详细说明,不太熟悉的读者可进行辅助阅读。
11.1.1 有符号整数
有符号数在协处理器中的应用与前面章节中所描述的方法是一致的,它是各种数据类型的基础。这些整数可分为:16位(字型)、32位(短整型)和64位(长整型),其最高位为符号位。这些整数的数据格式如图11.1所示,它们所能表示的数据范围如表11.1所列。
|
|
|
|
|
|
表11.1 各类整型数据的表示范围
数据类型 |
范 围 |
字型 |
-32768 ~ 32767 |
短整型 |
-2147483648 ~ 2147483647 |
长整型 |
-9×1018 ~ 9×1018 |
在汇编语言环境下,这三种整型数据的定义符分别为:DW、DD和DQ。如:
|
data1 |
DW 2, -340 |
;16位整数 |
data2 |
DD 321, -320 |
;短型整数 |
|
data3 |
DQ -1230, 9034 |
;长型整数 |
11.1.2 BCD码数据
一个BCD码数据在内存中占80位,共10个字节。其最高位字节用来表示正负号,其余9个字节,每个字节内含有二个BCD码,所以,一个BCD码数据可表示18个BCD编码。BCD码的数据格式如图11.2所示。
9 |
… |
3 |
2 |
1 |
0 |
符号字节 |
… … |
BCD |
BCD |
BCD |
BCD |
图11.2 BCD码的数据格式
关于BCD码的正负数,有如下规定:
、若最高位字节的值为0H,则表示该BCD码的值为正数;
、若最高位字节的值为80H,则表示该BCD码的值为负数。
在汇编语言环境下,BCD码数据的定义符为:DT。如:
.387
BCD1 DT 1234, -340
该说明语句决定了数据在内存中的存储形式如下:
00000000000000001234,80000000000000000340
11.1.3 浮点数
在计算机中,浮点数一般由三部分组成:数值的符号位、阶码和有效数字(以后简称为尾数)。这种浮点数是用科学记数法来表示的,即:浮点数=符号位.有效数字×2阶码。
Intel系列的协处理器支持3种形式的浮点数:短型浮点数(32位)、长型浮点数(64位)和临时浮点数(80位),它们分别对应单精度、双精度和扩展精度浮点数。这些浮点数的数据格式都符合IEEE-754标准,它们的具体格式如图11.3所示。
|
|
|
一、十进制数转换成浮点数的步骤
|
1、将十进制数转换成二进制数:整数部分用2来除,小数部分用2来乘; |
|
2、规格化二进制数:改变阶码,使小数点前面仅有第一位有效数字; |
||
3、计算阶码: |
||
|
◆ 短型浮点数的阶码加上偏移量7FH ◆ 长型浮点数的阶码加上偏移量3FFH ◆ 扩展型浮点数的阶码加上偏移量3FFFH |
|
4、以浮点数据格式存储。 |
把数值的符号位、阶码和尾数合在一起就得到了该数的浮点存储形式。
注意:尾数是带有一个隐含位的23位数,即:数“1.XXXX”的尾数是“XXXX”,前面的”1”被隐含掉,它只在扩展精度的格式中才被显式表示出来。
例11.1 把十进制数100.25转换成协处理器中的浮点数
解: |
|
|
1、进制转换:(100.25)10=(1100100.01)2 |
2、规格化:(1100100.01)2=1.10010001×26=1.10010001×2110 |
|
3、计算阶码:110 01111111=10000101 |
|
4、数值的符号位为0,阶码为:10000101,尾数为:1001 0001 0000 0000 0000 000 |
|
综合上述可得:(100.25)10的浮点形式为:0 10000101 10010001000000000000000 |
下面是学习和掌握十进制数转化为浮点数的控件,它可按步骤演示整个转换过程。
几个特殊数据的存储规则:
其中:NAN — Not-A-Number。
二、浮点数转换成十进制数的步骤
该步骤与前面“十进制数转换成浮点数”的步骤是互逆的,其具体步骤如下:
1、分割数字的符号、阶码和有效数字;
2、将偏移阶码减去偏移,得到真正的阶码;
3、把数字写成规格化的二进制数形式;
4、把规格化的二进制数改变成非规格化的二进制数;
5、把非规格化的二进制数转换成十进制数。
例11.2 把协处理器中的浮点数1100000111001001000000000000转换成十进制数
正0: |
所有的数据位都是0; |
负0: |
最高位为1,其它的数据位是0; |
正/负无穷: |
符号位为0/1,阶码位全为1,有效数字全为0; |
NAN: |
非法的浮点数,阶码位全为1,有效数字不全为0; |
解 |
|
|
1、把浮点数1100000111001001000000000000分割成三部分,可得: |
符号位是1,阶码是10000011,尾数是1001001000000000000 |
|
2、还原阶码:10000011 – 01111111=100 |
|
3、该浮点数的规格化形式:1.1001001×24 (其中前面的“1.”从隐含位而来) |
|
4、该浮点数的非规格化形式:11001.001 |
|
5、该浮点数的十进制数为-25.125 (因为符号位为1,所以,该数是负数) |
下面是学习和掌握十进制数转化为浮点数的控件,它可按步骤演示整个转换过程。
三、浮点数说明形式
在汇编语言中,可用DD、DQ和DT来分别说明单精度、双精度和扩展精度的浮点数。
在MASM 6.0系统中,正浮点数前面不能书写‘ ’,但MASM 6.11系统更正了这种错误,并提供了新的浮点数说明方法,即:可用REAL4、REAL8和REAL10来分别代替DD、DQ和DT。
在定义浮点数时,要使用伪指令.8087、.287或.387等。
例如:
|
.387 |
|||
data1 |
DD |
123, -543 |
;定义单精度浮点数 |
|
data2 |
REAL4 |
3.345E 3 |
;定义单精度浮点数 |
|
data3 |
REAL8 |
321.545 |
;定义双精度浮点数 |
|
data4 |
REAL10 |
254.555 |
;定义扩展精度浮点数 |