第二章 指令系统
( 指令系统是计算机系统结构的主要组成部分
( 指令系统是软件与硬件分界面的一个主要标志
( 指令系统软件与硬件之间互相沟通的桥梁
( 指令系统与软件之间的语义差距越来越大
2.1 数据表示
2.2 寻址技术
2.3 指令格式的优化设计
2.4 指令系统的功能设计
2.5 RISC指令系统
2.1 数据表示
( 新的研究成果,如浮点数基值的选择
( 新的数据表示方法,如自定义数据表示
2.1.1 数据表示与数据类型
2.1.2 浮点数的设计方法
2.1.3 自定义数据表示
2.1.1 数据表示与数据类型
( 数据的类型:文件、图、表、树、阵列、队列、链表、栈、向量、串、实数、整数、布尔数、字符
( 数据表示的定义:数据表示研究的是计算机硬件能够直接识别,可以被指令系统直接调用的那些数据类型。
例如:定点、逻辑、浮点、十进制、字符、字符串、堆栈和向量
( 确定哪些数据类型用数据表示实现,是软件与硬件的取舍问题
( 确定数据表示的原则:
一是缩短程序的运行时间,
二是减少CPU与主存储器之间的通信量,
三是这种数据表示的通用性和利用率。
例2.1:实现A=A+B,A和B均为200×200的矩阵。分析向量指令的作用解:如果在没有向量数据表示的计算机系统上实现,一般需要6条指令,其中有4条指令要循环4万次。因此,CPU与主存储器之间的通信量:
取指令2+4×40,000条,
读或写数据3×40,000个,
共要访问主存储器7×40,000次以上如果有向量数据表示,只需要一条指令
减少访问主存(取指令)次数:4×40,000次缩短程序执行时间一倍以上
( 数据表示在不断扩大,如字符串、向量、堆栈、图、表
( 用软件和硬件相结合的方法实现新的数据表示例如:用字节编址和字节运算指令来支持字符串数据表示
用变址寻址方式来支持向量数据表示
2.1.2 浮点数的设计方法
1、浮点数的表示方式
( 一个浮点数N可以用如下方式表示:
需要有6个参数来定义。
两个数值:
m:尾数的值,包括尾数的码制(原码或补码)和数制(小数或整数)
e:阶码的值,移码(偏码、增码、译码、余码等)或补码,整数两个基值:
rm:尾数的基值,2进制、4进制、8进制、16进制和10进制等
re:阶码的基值,通常为2
两个字长:
p:尾数长度,当rm=16时,每4个二进制位表示一位尾数
q:阶码长度,阶码部分的二进制位数
p和q均不包括符号位
( 浮点数的存储式
1位 1位 q位 p位
mf
ef
e
m
注:mf为尾数的符号位,ef为阶码的符号位,e为阶码的值,m为尾数的值。
2、浮点数的表数范围
( 尾数为原码
尾数用原码、纯小数,阶码用移码、整数时,规格化浮点数N的表数范围:

( 尾数为补码尾数用补码表示时,正数区间的表数范围与尾数采用原码时完全相同,而负数区间的表数范围为:

( 浮点数在数轴上的分布情况
  上溢 下溢(浮点零) 上溢
  -Nmin 负数区  -Nmax 0 Nmin 正数区 Nmax
例2.2:设p=23,q=7,rm=re=2,尾数用原码、纯小数表示,阶码用移码、整数表示,求规格化浮点数N的表数范围。
解:规格化浮点数N的表数范围是:

即: 
例2.3:尾数用补码、纯小数表示,阶码用移码、整数表示,p=6,q=6,rm=16,re=2,求规格化浮点数N的表数范围。
解,规格化浮点数N在正数区间的表数范围是:

在负数区间的表数范围是:

3、浮点数的表数精度(误差)
( 产生误差的根本原因是浮点数的不连续性
( 误差产生的直接原因有两个:
一是两个浮点数都在浮点集内,而运算结果却可能不在这个浮点集内,
二是数据从十进制转化为2、4、8、16进制,产生误差。
( 规格化尾数的表数精度为:

最后1个有效位的可信度为一半,
当rm=2时,有:

4、浮点数的表数效率
( 浮点数是一种冗余数制(Redundat Number System)
( 浮点数的表数效率定义为:

简化表示:
当尾数基值为2时,浮点数的表数效率为:

( 浮点数的表数效率随rm增大
当尾数基值rm=16时,浮点数的表数效率为:

尾数基值rm=16与rm=2相比,浮点数的表数效率提高了:

4、浮点数尾数基值的选择
( 在表示浮点数的6个参数中,只有尾数基值rm、尾数长度p和阶码长度q
与表数范围、表数精度和表数效率有关
( 在字长确定的情况下,如何选择尾数基值rm,使表数范围最大、表数精度和表数效率最高;
假设有两种表示方式F1和F2,它们二进制字长相同,尾数都用原码或补码、小数表示,阶码都用移码、整数表示,阶码的基均为2,尾数的基不同。
浮点数表示方式F1:尾数基值rm1=2,尾数长度p1,阶码长度q1,
二进制字长:L1=p1+q1+2。
浮点数表示方式F2:尾数基值rm2=2k,尾数长度p2,阶码长度q2,
二进制字长:L2=k p2+q2+2。
由F1与F2的二进制字长相同,即L1=L2,得:
p1+q1=k p2+q2 (2.1)
( 字长和表数范围确定时,尾数基值rm与表数精度的关系
F1的表数范围是:,
F2的表数范围是:,
F1与F2的表数范围相同,得到:
两边取以2为底的对数,得到:q1=q2+log2 k (2.2)
把(2.2)式代入(2.1)式,得到:p1=k p2-log2 k (2.3)
F1的表数精度是: (2.4)
把(2.3)代入(2.4)得到:
F2的表数精度是:
取F2与F1表数精度的比值: (2.5)
只有k=1(尾数基值rm=2)或k=2(尾数基值rm=4)时,比值T=1。
结论1:在字长和表数范围一定时,尾数基值rm取2或4,浮点数具有最高的表数精度。
( 字长和表数精度一定,尾数基值rm与表数范围的关系由F1与F2的表数精度相同得到:

即: p1=kp2-k+1 (2.6)
把(2.6)代入(2.1)得到:q1=q2+k-1 (2.7)
F1的表数范围:
F2的表数范围:
假设表数范围F2大于F1,则阶码的最大值F2大于F1:

这个不等式在正整数定义域内没有解,即不存在比F1的表数范围更大的浮点数表示方式只有k=1(尾数基值rm=2)或k=2(尾数基值rm=4)时,F2阶码的最大值等于F1阶码的最大值。
结论2:在字长和表数精度一定时,尾数基值rm取2或4,浮点数具有最大的表数范围。
推论1:在字长确定之后,尾数基值rm取2或4,浮点数具有最大的表数范围和最高的表数精度。
例2.4:IBM 370系列计算机的短浮点数表示方式,尾数基值rm=16,尾数字长为16进制6位,阶码基值rm=2,阶码字长6位,尾数用原码、小数表示,阶码用移码、整数表示。求表数范围和表数精度,并尾数基址rm=2的浮点数表示方式进行比较。
解,表数精度为:
表数范围是:
若尾数基值rm=2,则有:
解得p=21,则q=32-21-2=9,它的表数范围是:

推论2:浮点数的尾数基值rm取2,并采用隐藏位表数方法是最佳的浮点数表示方式。这种浮点数表示方式能做到表数范围最大、表数误差最小、表数效率最高。
目前,IBM公司的IBM360、370、4300系列机等,尾数基值rm=16。
Burroughs公司的B6700、B7700等大型机,尾数基值rm=8。
DEC公司的PDP-11、VAX-11和Alpha等小型机,CDC公司的CDC6600、CYBER70等大型机,Intel公司的x86系列机等均采用尾数基值rm=2。
5、浮点数格式的设计定义浮点数表示方式的6个参数的确定原则:
( 尾数:多数机器采用原码、小数表示
采用原码制表示:加减法比补码表示复杂,乘除法比补码简单
表示非常直观。
采用小数表示能简化运算,特别是乘除法运算。
( 阶码:一般机器都采用整数、移码表示采用移码表示的主要原因是:浮点0与机器0一致。
阶码进行加减运算时,移码的加减法运算要比补码复杂
( 尾数的基值rm选择2,
( 阶码的基值re取2,
浮点数格式设计的关键问题是:
在表数范围和表数精度给定的情况下,如何确定最短的尾数字长p和阶码字长q
例2.5:要求设计一种浮点数格式,其表数范围不小于1037,正、负数对称,表数精度不低于10-16。
解:根据表数范围的要求:
解这个不等式:
取阶码字长q=7
根据表数精度的要求,得到:
解这个不等式:
由于浮点数字长通常是8的倍数,因此取尾数字长p=55
所设计浮点数的格式如下:
1位 1位 7位 55位
mf
ef
e
M
所设计浮点数的主要参数如下:
最大尾数值:
绝对值最小的尾数值:
最大阶码:
最小阶码:
最大正数:;
最小正数:;
最大负数:;
最小负数:;
表数精度:;
浮点零:浮点零与机器零相同,64位全为0;
表数效率:采用隐藏位,表数效率;
6、浮点数的舍入处理
( 浮点数要进行舍入处理的原因是:
十进制实数转化为浮点数时,有效位长度超过给定的尾数字长。
两个浮点数的加、减、乘、除结果,尾数长度超过给定的尾数字长。
( 舍入处理要解决的问题是:
把规格化尾数的p+g位处理成只有p位。
其中:p是浮点数表示方式给定的尾数字长,
g是超过给定尾数字长的部分。
( 舍入方法的主要性能标准是:
绝对误差小,积累误差小,容易实现。
( 进行舍入处理时要注意的问题是:
必须先规格化,然后再舍入,否则舍入是没有意义的。
在计算积累误差时,要同时考虑到正数区和负数区的情况;
方法1:恒舍法恒舍法又称截断法、必舍法等恒舍法的主要优点:实现起来非常容易。误差大。
恒舍法的舍入规则及误差情况
尾数有效字长p位
有效字长之外g位
误差情况
正数区
舍入前
0.xxx......xx
0.xxx......xx
0.xxx......xx
......
0.xxx......xx
00......000
00......001
00......010
......
11......111
(=0
(=-2-p-g
(=-2-p-g+1
,.....
(=-2-p(1-2-g)
舍入后
0.xxx......xx
(=-2-p-1(2g-1)
负数区
舍入前
-0.xxx......xx
-0.xxx......xx
-0.xxx......xx
......
-0.xxx......xx
00......000
00......001
00......010
......
11......111
(=0
(=+2-p-g
(=+2-p-g+1
,.....
(=+2-p(1-2-g)
舍入后
-0.xxx......xx
(=+2-p-1(2g-1)
方法2:恒置法又称恒置r/2法、恒置1法、或冯诺依曼法。
恒置法的舍入规则是:把规格化尾数有效字长p位的最低一位置成r/2。
恒置法的主要缺点:表数精度比较低。
主要优点:实现起来比较容易,
在正数区和负数区的积累误差都比较小,而且能达到平衡。
恒置法在正数区的舍入规则及误差情况正数区
尾数有效字长p位
有效字长之外g位
误差情况
舍入前
0.xxx......xx0
0.xxx......xx0
0.xxx......xx0
......
0.xxx......xx0
0.xxx......xx1
0.xxx......xx1
0.xxx......xx1
0.xxx......xx1
00......000
00......001
00......010
......
11......111
00......000
00......001
11......110
11......111
+2-p —— 误差积累
+2-p(1-2-g)
+2-p(1-2-g+1)
,.....
+2-p-g
0
-2-p-g
,.....
-2-p(1-2-g+1)
-2-p(1-2-g)
舍入后
0.xxx......xx1
积累误差(=2-p
方法3:下舍上入法又称为4舍5入法、0舍1入法、7舍8入法等。
下舍上入法的舍入规则是:g位代码的中间值为界,小于这个中间值的则舍,大于或等于这个中间值的则入。
下舍上入法的主要优点:精度高,积累误差小。
在正数区和负数区的积累误差能达到完全平衡。
主要缺点:实现起来比较困难。
上舍下入法的舍入规则及误差情况正数区
尾数有效字长p位
有效字长之外g位
误差(
舍入前
0.xxx......xx
0.xxx......xx
0.xxx......xx
......
0.xxx......xx
0.xxx......xx
0.xxx......xx
......
0.xxx......xx
0.xxx......xx
00......000
00......001
00......010
......
01......111
10......000
10......001
11......110
11......111
0
-2-p-g
-2-p-g+1
,.....
-2-p-1(1-2-g)
+2-p-1—积累误差
+2-p-1(1-2-g)
,.....
+2-p-g+1
+2-p-g
舍入后
0.xxx......xx
0.xxx......xx+2-p
最高位为0
最高位为1
积累误差(=+2-p-1
方法4:R*舍入法
R*舍入法的优点:没有积累误差。精度很高。
主要缺点:实现起来非常复杂,要判断g是否为10......00,采用下舍上入法或恒置法,判断舍入后是否溢出,若溢出,要再次进行右规格化。
只有少数巨型计算机(如BSP科学处理机)采用R*舍入法。
R*舍入法的舍入规则及误差情况舍入方法
舍入前(p+g位)
舍入后(p位)
误差情况
下舍上入法下舍上入法下舍上入法

下舍上入法恒置1法恒置1法下舍上入法

下舍上入法下舍上入法
0.xxx...xx|00...00
0.xxx...xx|00...01
0.xxx...xx|0...010

0.xxx...xx|01...11
0.xxx...x0|10...00
0.xxx...x1|10...00
0.xxx...xx|10...01

0.xxx...xx|11...10
0.xxx...xx|11...11
0.xxx...xx
0.xxx...xx
0.xxx...xx

0.xxx...xx
0.xxx...x1
0.xxx...x1
0.xxx...xx+2-p

0.xxx...xx+2-p
0.xxx...xx+2-p
0
-2-p-g
-2-p-g+1

-2-p-1(1-2-g+1)
+2-p-1
-2-p-1
+2-p-1(1-2-g+1)

+2-p-g+1
+2-p-g
方法5:查表法又称ROM舍入法,PLA舍入法等。
查表入法的主要优点:
通过修改ROM或PLA中的内容来使积累误差达到平衡。
查表法继承了下舍上入法精度高、积累误差小的优点,同时又克服了它实现起来比较困难的缺点。
n=2时查表法的舍入规则及误差情况分析
ROM地址
舍入前(p+g位)
舍入后(p位)
误差情况
000
001
010
011
100
101
110
111
xx…x00|0xx…x
xx…x00|1xx…x
xx…x01|0xx…x
xx…x01|1xx…x
xx…x10|0xx…x
xx…x10|1xx…x
xx…x11|0xx…x
xx…x11|1xx…x
xx…x00
xx…x01
xx…x01
xx…x10
xx…x10
xx…x11
xx…x11
xx…x11
-2-p-1(1-2-g+1)~0
+2-p-g~2-p-1
-2-p-1(1-2-g+1)~0
+2-p-g~2-p-1
-2-p-1(1-2-g+1)~0
+2-p-g~2-p-1
-2-p-1(1-2-g+1)~0
+2-p(1-2-g)~-2-p-1
}+2-p-1
}+2-p-1
}+2-p-1
}-2-p-1(2g-1)
关于舍入方法的主要结论:
(1) 恒置法虽有少量的积累误差,且损失一位精度,但由于实现起来很容易,已普遍在小型及微型机中使用。
(2) R*舍入法是唯一一种积累误差能达到完全平衡的舍入方法,但由于实现起来非常复杂,仅在极少数对误差要求非常高的具型计算机中才采用。
(3) 下舍上入法只有少量的积累误差,且精度也比较高,但实现起来很复杂,在用软件实现的算法中经常采用。
(4) 查表法实现比较容易,积累误差很小,而且可以通过改变ROM或PLA中的内容来修正积累误差,因此是一种很有前途的舍入方法。
五种舍入方法的主要性能比较舍入方法
在正数区的误差范围
正数区的积累误差
实现的难易程度
恒舍法
-2-p(1-2-g)~0
+2-p-1(2g-1)
最简单
恒置法
-2-p(1-2-g)~+2-p
+2-p
很简单
下舍上入法
-2-p-1(1-2-g+1)~+2-p-1
+2-p-1
很复杂
R*舍入法
-2-p-1~+2-p-1
0
最复杂
查表法
-2-p(1-2-g)~+2-p-1
+2-p-1(2n-2g)
一般
p是规格化尾数有效位的字长,g是尾数有效字长之外的长度,
n是查表法中ROM或PLA的字长
7、警戒位的设置方法为了保证浮点数在运算和转换过程中的精度,在规定的尾数字长之外,运算器中的累加器需要另外增加的长度称为警戒位(Guard Digit or Guard Bit)。
( 不设置警戒位,可能出现很大的误差。一个例子:
例1:0.10000000×20-0.11111101×2-1,没有警戒位时:
0.10000000×20
对阶,+1.10000001×20
求和,0.00000001×20
左规,0.10000000×2-7
设置一个警戒位时:
0.10000000
对阶:+1.10000001
×20
1×20
求和,0.00000001
左规,0.11000000
1×20
×2-7
( 可能造成完全错误的运算结果。
例2:0.1000×2125-0.1111×2124,设置一个警戒位时:
0.1000
对阶,+1.1000
×2125
1×2125
求和,0.0000
左规,0.1000
1×2125
×2121
不设置警戒位时,运算结果是0。
0.1000×2125
对阶,+1.1000×2125
求和,0.0000×2125
( 警戒位的用处只有两个:
(1) 用于左规格化时移入尾数有效字长内。
(2) 用于舍入。
( 警戒位的来源有以下几个方面:
(1) 做加、减法时,因对阶从有效字长内移出去的部分。
(2) 做乘法时,双倍字长乘积的低字长部分。
(3) 做除法时,因没有除尽而多上商的几位。
(4) 右规格化时移出有效字长的那部分。
(5) 从十进制转换成二进制时,尾数超出有效字长的部分。
( 加减法运算对警戒位的需要
(1) 同号相加或异号相减,浮点数的尾数之和不需要左规格化。
≤|mA|<1,两数之和为:≤|mA+mB|<2,
(2) 同号相减或异号相加,阶差为0
例3:0.10001×20-0.10000×20=0.10000×2-4
0.10001
对阶,+1.10000
×20
×20
求和,0.00001
左规,0.10000
×20
×2-4
两个尾数之和最多左规格化p-1位,但是对阶时没有移出任何代码。
警戒位有需要但没有来源,因此不必设置警戒位。
(3) 同号相减或异号相加,阶差为1
例4:0.10000×20-0.11111×2-1=0.10000×2-5
p=5
g=1
0.10000
对阶,+1.10000
0×20
1×20
求和,0.00000
左规,0.10000
1×20
0×2-4
两个尾数之和最多左规格化p位,但是对阶时只移出1位代码,
只需要设置一位警戒位。
(4) 同号相减或异号相加,阶差大于或等于2
例5:0.10000×20-0.11111×2-2=0.10000×2-1
p=5
g=2
0.10000
对阶,+1.11000
00×20
01×20
求和,0.01000
左规,0.10000
舍入,0.10001
01×20
10×2-1 ×2-1
对阶时位移出去很多位,但是两个尾数之和最多只左规格化1位,
只需要为左规格化设置一位警戒位。
( 乘法运算对警戒位的需要
≤|mA|<1,两数乘积:≤|mA×mB|<1,
两个规格化尾数的乘积最多左规格化一位,因此只需要设置一个警戒位。
( 除法运算对警戒位的需要
≤|mA|<1,尾数的商: ≤||<rm,
两个规格化尾数的商不可能左规格化,因此不必设置警戒位。
各种情况下所需要的警戒位位数
用于左规用于舍入
加减法
1位
乘法
1位
除法
0位
右规
0位
十化二
0位
总 计
恒舍法 0位
1
1
0
0
0
1位
恒置法 -1位
0
0
-1
-1
-1
0位
下舍上入法 1位
2
2
1
1
1
2位
查表法 1位
2
2
1
1
1
2位
R*舍入法 2位
3
3
2
2
2
3位
当浮点尾数基值大于2时,用于舍入的最低位只需设置一个二进制位。