运算方法与运算器
定点数运算
加减运算
补码加减运算规则
-
参加运算的操作数用补码表示;
-
补码的符号位与数值位同时进行加运算:
加:两数补码直接相加;
减:对减数补码再求补(减数补码连同符号位一起按位取反,末位加1),再与被减数的补码相加。
运算结果即为和/差的补码。
-
什么情况下会发生溢出?
当两个同符号数相加或两个异符号数相减,运算结果可能会发生溢出;
当两个同符号数相减或两个异符号数相加,运算结果一定不会发生溢出;
-
课堂习题
-
如何判断是否发生了溢出?
- 双符号位判决法;
- 进位判决法;
- 根据运算结果的符号位和进位标志判别;
- 根据运算前后的符号位进行判别。
-
双符号位判别法
前提:两个n位数的加减运算结果用一个n+1位数一定能够正确表示
-
进位判别法
Cn-1为数值位最高位向符号位的进位,Cn位符号位向更高位的进位,二者不相等则发生溢出。
电路基本原理
![image-20210820214606425](https://i-blog.csdnimg.cn/blog_migrate/31d01c0014baeff0e460b595b756f8ea.png)
![image-20210820214917735](https://i-blog.csdnimg.cn/blog_migrate/bbede83afcc12f5230fd3663c447d231.png)
优先级:与>或(类比乘法、加法)
A(C+D) = AC+ AD ——分配律
ABC=A(BC) ——结合律
A+B+C=A+(B+C) ——结合律
一位全加器
- 进位产生函数:Zi=Xi⊕Yi⊕Ci
- 进位传递函数:Ci+1=(Xi·Yi)+(Xi ⊕ Yi)·Ci
Zi是全加器的结果,它的值取决于两个加数Xi,Yi和来自低位的进位Ci三者异或的结果;
Ci+1是向更高位的进位,中间是个或,左右两个条件只要有一个条件为真,那么进位就是高电平1:
- (Xi·Yi)为真,表示两个加数全为1,那么自然要向高位进位;
- (Xi ⊕ Yi)·Ci,表示两个加数异或的结果再与来自低位的进位相与,即两个加数只要有一个为1,并且Ci为1,那么就要向高位进位。
-
一位全加器的框图及其电路图(背)
n位全加器
行波进位加法器
将上述n个一位全加器串在一起:
![image-20210820222642729](https://i-blog.csdnimg.cn/blog_migrate/29c4ad22e007272b97679fe55cb981ac.png)
![image-20210820223444485](https://i-blog.csdnimg.cn/blog_migrate/e1a6c1e0d0b11b4966f5c0e6fb08e3c4.png)
-
n位加法器最长的信号通通路,电路要经过2n+1个门
-
优点:电路简单,扩展容易
-
缺点:进位由低位向高位逐位产生,延时高,速度相对较慢
-
通过控制M的输入可以实现加减法切换,前提是X和Y都要用补码表示。
先行波进位加法器
在进行加法运算前,先将各位全加器需要的进位计算出来,可以大大加快加法运算的速度。但是随着位数的增加,电路会越来越复杂。
实际设计加法器时,会采取行波进位加法器和先行波进位加法器互相结合的模式。
BCD加法运算
四位二进制数表示十进制一位数,把四位二进制数为一组(即一位BCD数)来算,最后判断是否需要校正:
-
某位BCD数(两个四位二进制数)相加的结果大于9
或
-
某位BCD数需要向更高位进位
则对每一位BCD结果进行+6(0110)修正。注意,以上条件只需要满足一个就要修正。
![image-20210821002011599](https://i-blog.csdnimg.cn/blog_migrate/6a20c72a9f27d6ea5518eb2eeea7e9e1.png)
移码的加减运算
-
求[X+Y]移
- 写出X移和Y移
- X移+Y移
- 符号位取反
-
求[X-Y]移
关键是求[-Y]移,和补码求相反数一样,直接对[Y]移求补即得[-Y]移,让后按照加法运算
乘法运算
原码乘法运算
原码一位乘法
-
符号位:两个数的符号位相异或
-
数值位:两个数的绝对值的数值位之积
-
[X]原 × [Y]原=(X0 ⊕ Y0 )(|X|×|Y|)
-
两个4位二进制数相乘用8位表示
-
原码一位乘法的运算过程(表格要会画,会考大题)
原码二位乘法
待自学
补码乘法运算
-
补码的一位乘法运算规则
-
布斯(Booth)法(要会画图)
-
乘数与被乘数均用补码表示,连同符号位一起参加运算;运算结果(乘积)也是补码。
-
乘数最低位后增加一个附加位(可用A-1表示),初始设定为0。
-
从附加位开始,按上表总共进行n次加操作、n-1次右移操作(最后一次不右移)。
-
右移按补码规则进行,即符号位复制。
-
-
举例
![](https://i-blog.csdnimg.cn/blog_migrate/4672c5ad0f8f1f65d0ffd8a4df3bfd3f.png)
步骤:
- 先写出[X]补,[Y]补,以及[-X]补
- 画图,两位符号位用来防止溢出,寄存器D初始值(包含符号位)为00 0000,寄存器A里面放乘数Y(包含1位符号位,共5位),附加位A-1初始值为0
- 后项-前一项,即0-1=-1,按照上述规则,要加[-X]补,同时DA右移1位,高位补符号位
- 重复3,直到A中的5位数全部计算完成,最后符号位计算完之后不用移位
- 结果数值位就是取DA中的八位:0111 1110,加上一位符号位,即1.0111 1110
阵列乘法器
![image-20210821233103153](https://i-blog.csdnimg.cn/blog_migrate/25c1c884adfa5a826f75e12d82b5cb9d.png)
答案:C
除法运算
原码除法运算
原码除法法则
![image-20210823211025274](https://i-blog.csdnimg.cn/blog_migrate/3f9d26d3938c314b36f2648fca86cf63.png)
恢复余数法
在CPU中,必须减过之后方能判断余数是否够减,当发现不够减时,在下面操作之前必须恢复余数。
这里的减|Y|是通过+[-|Y|]补实现的。
例:被除数 X=-0.10001011,除数 Y=0.1110,利用原码恢复余数法求商及余数。
解:前提条件:|X|<|Y|,|Y|≠0。[X]原=1.10001011,[Y]原=0.1110,[-|Y|]补=1.0010,商符=1⊕0=1。
绝对值除法过程:
![image-20210823211247150](https://i-blog.csdnimg.cn/blog_migrate/d99325594a5fd079bb9ad60416b6aa2c.png)
看符号位是0还是1来判断是否够减。
缺点:不同的被除数和除数,其除的过程不规范,何时需恢复余数是不相同的,实现起来不便于控制。
加减交替法
-
法则:
-
例题:
求出[X]原,[Y]原,[|Y|]原,[-|Y|]补。
-
例题
答案:ABE
算数逻辑单元
了解
运算器的结构
![image-20210824211957290](https://i-blog.csdnimg.cn/blog_migrate/b073e1d26ef10c7834991582e8e0ffbd.png)
单总线结构一次操作需要3个步骤,双总线2个,三总线1个。
单总线结构必须有2个暂存器,双总线1个,三总线0个。
- 例题
![image-20210824212425950](https://i-blog.csdnimg.cn/blog_migrate/13faa582dbce089a61553cafbb758256.png)
答案:B
-
例题
答案:B
-
计算机框图
虚线框起来的部分是CPU
S,T是ALU的两个暂存器
CB控制总线
AB地址总线
DB数据总线
SP,BP,SI,DI,AX,BX,CX,DX,8个通用寄存器
AR地址寄存器
DR数据寄存器
PC程序计数器
PSW标志寄存器
IR指令寄存器
浮点数运算
浮点数加减运算
-
对阶
为了尽量减小精度损失,采取:小阶对大阶,即小阶码+1,尾数右移1位,直到增大到与大阶码相同。
-
尾数加减运算
加减法统一为加法:减法时,对减数求补,然后与被减数相加。
-
规格化
-
左规:运算结果尾数为:11.1xx…x 或 00.0xx…x:尾数每左移1位,阶码减1,直到使尾数成为规格化数为止。
阶码减1,必须同时判断是否下溢。若发生下溢,可认为结果为0。
-
右归:若结果(尾数)发生溢出,即结果出现10.XX…X 或01.XX…X 时,尾数右移1位,阶码加1。右规最多1次。
阶码加1,必须同时判断是否上溢。若发生上溢,可认为结果为∞。
-
-
舍入处理
-
截(尾)断法
将需丢弃的尾数低位丢弃;
-
末位恒置1法
使要保留的尾数的最低位永远为1;
-
0舍1入法
当尾数右移丢弃的是1时,要保留的尾数最末位加1;
当尾数右移丢弃的是0时,要保留的尾数最末位不变。
当遇到01.111…11这种需右规的尾数时,采用此法会再次使尾数溢出。遇到这种情况可采用截尾法。
-
-
例题:例3.18(极有可能考大题)
-
例题
答案:D
浮点数的溢出由阶码决定:
当阶码小于-2m-1时(阶码用m位补码表示),发生下溢出,此时可认为结果为0
当阶码大于+2m-1时(阶码用m位补码表示),发生上溢出,此时可认为结果为无穷大。
浮点数乘除运算
-
浮点乘法运算
<img src=“https://s2.loli.net/2022/04/05/E3cPK9zYsVaT1kt.png” alt=“image-20210830223149033” style="zoom: width=“67%”/>
-
浮点除法运算
-
例题(尾数用原码表示)
分析:
- 只有当运算结果尾数向上溢出时需要右归,但时n位二进制的加减法结果用n+1位数一定能表示,所以最多需要右归1次。但是如果两个数的绝对值非常接近,他们做加减运算时,结果可能非常小,需要左归很多次,但是不会超过n-1次。
- 规格化原码的表示范围是1/2<=|M|<1,两个小于1的数相乘,结果也是小于1,结果不会超过1,所以不需要右归。当两个数的绝对值都是1/2时,这个时候乘法的结果最小,绝对值为1/4,0.0100000…,也之需要左归一次。
- 不需要左归,除以一个小于1的数,结果会越除越大,不会比被除数小,所以不需要左归。考虑极端情况,1÷1/2=2,10.000000…,也只需要右归一次。
-
例题
答案:B