内容根据秦磊华《计算机组成原理》正文及习题和华科大网课及习题整理而来
加法器部分
-
补码加法的运算如公式
[x]补+[y]补=[x+y]补(mod M)
所示,含义是:在以M为模时,两个数的补码之和等于两个数之和的补码。它说明两个用补码表示的数相加,所得的结果为补码表示的和。对定点小数而言,M=2;对定点整数而言,M=2^(n+1),其中n为定点整数位数(不含符号位)。 -
溢出检测的第一种方法:根据操作数和运算结果的符号位是否一致进行检测(只有相同的数相加的时候才会产生溢出),逻辑表达式为:
V = X f Y f S f ˉ + X f ˉ Y f ˉ S f V = X_{f}Y_{f}\bar{S_{f}}+\bar{X_{f}}\bar{Y_{f}}S_{f} V=XfYfSfˉ+XfˉYfˉSf
X f 、 Y f 为 参 与 运 算 数 的 符 号 位 , S f 为 结 果 符 号 位 , V 为 溢 出 标 志 位 X_{f}、Y_{f}为参与运算数的符号位,S_{f}为结果符号位,V为溢出标志位 Xf、Yf为参与运算数的符号位,Sf为结果符号位,V为溢出标志位 -
溢出检测的第二种方法:根据运算过程中最高数据位的进位与符号位的进位位是否一致进行检测。最高数据位进位和符号位不同,则溢出。逻辑表达式为:
V = C D ⨁ C F V = C_{D}\bigoplus C_{F} V=CD⨁CF -
溢出检测的第三种方法:利用变形补码进行检测。对定点小数而言,采用变形补码后,其模为4,因此,也称为“模4补码”;对整数而言,采用变形补码后,其模为2^(n+2)(n为数值位的位数)。采用变形补码后,正数符号以“00”表示,负数的符号以“11”表示。一般称左边的符号位为第一符号位,右边的符号位为第二符号位。若运算结果的符号位为“01”或“10”,则表明分别产生了上溢和下溢。
-
采用先行进位部件和ALU模块可构建长度可变的并行进位运算器。
-
G =A3B3+(A3+B3)(A2B2+(A2+B2)(A1B)+ (A1+B1) A 0B0)) 为 进位产生函数,P=(B3+A3) (B2+A2)( A1+B1 ) (A0+B0)为进位传递函数
乘法器部分
-
逻辑右移:右移补0
-
算数右移:右移补符号位
-
乘法器进行机器运算的原理:
此处可以联想到在汇编中寄存器结果的保存方法 -
原码一位乘法算法:符号位单独参加运算,数据位取绝对值参加运算(如下所示,P0是符号位)
P 0 = X 0 ⨁ Y 0 P_{0} = X_{0}\bigoplus Y_{0} P0=X0⨁Y0
∣ P ∣ = ∣ X ∣ ⨁ ∣ Y ∣ |P| = |X|\bigoplus |Y| ∣P∣=∣X∣⨁∣Y∣ -
原码乘法执行中所有移位都是算数移位(答案如此,但是实验中一部分是逻辑移位);原码乘法执行过程中一共执行n-1次算数右移和加法运算
-
补码乘法运算公式:设
[ X ] 补 = X 0 X 1 X 2 X 3 … X n [X]_{补}=X_{0}X_{1}X_{2}X_{3}\ldots X_{n} [X]补=X0X1X2X3…Xn
[ Y ] 补 = Y 0 Y 1 Y 2 Y 3 … Y n [Y]_{补}=Y_{0}Y_{1}Y_{2}Y_{3}\ldots Y_{n} [Y]补=Y0Y1Y2Y3…Yn
则有:
[ X ∗ Y ] 补 = [ X ] 补 ∗ ( 0. Y 0 Y 1 Y 2 Y 3 … Y n ) ∗ [ X ] 补 [X*Y]_{补}=[X]_{补}*(0.Y_{0}Y_{1}Y_{2}Y_{3}\ldots Y_{n})*[X]_{补} [X∗Y]补=[X]补∗(0.Y0Y1Y2Y3…Yn)∗[X]补
进一步展开合并有:
[ X ∗ Y ] 补 = [ X ] 补 ∗ ∑ i = 0 n ( y i + 1 − y i ) 2 − i [X*Y]_{补}=[X]_{补}*\sum_{i=0}^n (y_{i+1}-y_{i})2_{}^{-i} [X∗Y]补=[X]补∗i=0∑n(yi+1−yi)2−i -
上式中,有 y n + 1 = 0 y_{n+1}=0 yn+1=0
-
运算规则:
-
运算过程中采用双符号位,部分积每一次算数右移一位,移除的数放入乘数寄存器的最高位
-
实例:
-
补码的符号扩展就是把所有高位重复符号位即可,0则全0,1则全1
-
补码乘法过程中共执行n 次加法(计算了符号位)和n-1 部分积右移(最后一次加完不需要右移)
除法器部分
除法器不要求设计电路,在此仅做简述
- 原码加减交替法除法
- 原码加减交替法除法中,运算过程中每执行一次加法都要上商
- 原码恢复余数法除法除法过程对余数的左移是算术移位
浮点数
这一部分是运算重点,经常在选择填空中出现。
*浮点数的加减运算过程
浮点数的加减运算过程是一个比较重要的知识点,所以给出详细的过程,如果想要了解前置知识或者扩展内容,可以参考:点这里
原
理
:
设
x
=
2
E
x
∗
M
x
,
y
=
2
E
y
∗
M
y
原理:设x=2^{E_{x}}*M_{x},y=2^{E_{y}}*M_{y}
原理:设x=2Ex∗Mx,y=2Ey∗My
则:
x
+
y
=
(
2
E
x
−
E
y
∗
M
x
+
M
y
)
∗
2
E
y
(
E
y
≥
E
x
)
x+y=(2^{E_{x}-E_{y}}*M_{x}+M_{y})*2^{E_{y}}(E_{y}\ge E_{x})
x+y=(2Ex−Ey∗Mx+My)∗2Ey(Ey≥Ex)
第一步:
化成标准形式,也就是阶码*补码的形式
第二步:对阶
求阶差;根据阶差将阶码较小的浮点数尾数右移相应位数
第三步:尾数加减运算
第四步:结果规格化(见下文)
第五步:舍入(0舍1入:若右移出的是1则在最低位加1;恒置1:只要数字位1被移掉,就将最后一位恒置成1)
第六步:溢出处理(上溢:符号位为01 下溢:符号位为10)
规格化方法
- 当尾数结果为00.0a…a或11.1aaaa,需要左规格化即将星数向左移动,每移动一次,阶码减1,直到尾数形式为00.1a…a或11.0a…a。
- 当尾数的结果为01.a…a或10.aaaa,表明尾数求和的结果>1,此时仅需要执行一次右移规格化,阶码加1,尾数形式即为00.1a…a或11.0a…a
例子:27/64= 0.110110 * 2^(-1)
尾数符号:0, 阶符符号:1, 阶码值:11, 尾数值:110110
- 当运算阶码大于最大阶码时,属溢出;当运算阶码小于最小负阶码时,计算机按0处理。