一、组合逻辑电路和时序逻辑电路
组合逻辑电路:其输出仅取决于当前输入组合,不依赖先前输出,不具备存储状态的能力
时序逻辑电路:其输出不仅取决于当前输入,还取决于先前的输出,具备存储状态的能力。
ALU作为运算器的核心部件,只有运算当前输入的能力,并没有存储的能力,所以属于组合逻辑电路。
二、运算器的组成
运算器是由ALU(算术逻辑单元),AC(累加器),状态寄存器,通用寄存器(如ACC,MQ,X)组成。
ALU的功能包括算数运算(+-*/)和逻辑运算(或与非)。
三、移位操作和原码乘法
移位分为逻辑移位和算术移位。
逻辑运算针对无符号数,分为逻辑左移和逻辑右移。算术运算针对有符号数,分为算术左移和算术右移。
逻辑左移:低位补0,高位移出。
逻辑右移:高位补0,低位移出。
算术左移:低位补0,高位移出。
算术右移:高位补符号位,低位移出。
算数左移是进行乘法运算,左移一位是*2。
算数右移是进行除法运算,右移一位是/2。
原码乘法:符号位和数值位分开算。
例如原码01011*11001。其中01011是正数,11001是负数,乘出的结果一定是负数,所以符号位不用参与运算。只运算1011*1001,也就是两个原码的绝对值相乘,最后把运算结果(此时没有符号)补上符号位1.
四、溢出判断
左移时有可能发生溢出。
第一种判断溢出方法:
先看不溢出的情况,设0001(补码)左移一位变成0010(补码),发现数值从1变成了2。再如1111(补码)左移一位1110(补码),发现数值从-1变到-2。所以在不溢出时,左移一位数值会变成原来的两倍 。
再看溢出的情况,设1000(补码)左移一位变成(0000),发现数值从-8变成0,不是原来的两倍。再设1010(补码)左移一位变成0100(补码),从-6变成4,也不是原来的两倍。
总结:发生溢出就是左移一位后的值不是原来的两倍,或者说左移后符号位发生了变化时一定发生溢出。也可以看前两位,若相同,则不溢出;若不同,则溢出。
第二种判断溢出方法:单符号位法(+-)
第一种判断溢出方法是对移位操作,第二种判断溢出方法是对算术加法或算术减法(+-)。
例如:1001和1010进行相加。在计算1001+1010的时候看最高位的进位和第二位的进位,发现第一位进位为1,第二位的进位为0。
然后对这两位进行异或操作。异或:相同为0,不同为1。
1和0的异或是1,所以发生溢出。
最后计算出结果0011进行验证,发现两个负数相加得出正数,发生了溢出。
第三种判断溢出方法:双符号位法(算术加法或算术减法)
例如:1001和1010进行相加。相加前在最高位补个符号位,变成11001和11010.
然后进行11001+11010=10011,发现两个符号位一个为1,一个为0,所以发生溢出。
此处符号位为10,这是正溢出;而如果是01,则是负溢出。
第四种判断溢出方法:转真值,运算(+-*/都可算)
把两个补码转成原码,然后看结果是否超出范围。
例如:8位补码a=F5H,b=EEH,分别计算a+b,a-b,a*b,a/b,若将结果放在一个8位寄存器中,判断那种计算会发生溢出
答案:a*b
补码:a=1111 0101,b=1110 1110。
原码:a=1000 1011,b=1001 0010。
真值:a=-11,b=-18
运算:a+b=-29,a-b=9,a*b=198,a/b=11/18
因为结果放在一个8位寄存器中,计算机中8位寄存器可表示的范围是-128-127(补码范围)
发现a*b=198超出这个范围,8位计算机表示不出来,所以肯定会溢出。
五、加法器
加法器不分有符号数和无符号数。
加法和减法的控制靠Sub信号,Sub如果是0,为加法;如果是1,为减法。
对两个数进行加法或减法时,一个数x直接进入加法器,而对于另外一个数y,会进行判断。
在y进入加法器前有一个选择器,这个选择器如果收到Sub=0,那么y直接进入加法器;这个选择器如果收到Sub=1,那么y进入加法器前需要进行一次全部取反的操作。
Cin(低位进位信息)=Sub
六、例题
1.补码定点整数01010101,左移两位后的值是( )
答案:01010100
解析:补码(有符号数),所以左移代表算数左移。算术左移:低位补0,高位移出。左移一位10101010,左移两位,01010100。
2.下列4个补码整数算数左移不会溢出的是()
A.80H
B.90H
C.B0H
D.C0H
答案:D
解析:首先写出ABCD的二进制数:
A.1000 0000
B.1001 0000
C.1011 0000
D.1100 0000
再写成算数左移一位的值:
A.0000 0000
B.0010 0000
C.0110 0000
D.1000 0000
根据溢出总结,左移后符号位改变的一定溢出,可知A,B,C一定溢出,所以选D。
D.1100 0000是-64,移位后1000 0000是-128 ,刚好是原来的两倍,所以不发生溢出。
3.补码定点整数1001 0101右移一位的值是( )
答案:1100 1010
解析:补码(有符号数)右移一位,高位补符号位,低位移出。1001 0101是一个负数,所以右移补1,右移一位变成1100 1010
4.用双符号位,两个正数相加会产生溢出,那么双符号位是()
A.00
B.01
C.10
D.11
答案:B
解析:两个正数相加且产生溢出,那么一定是正溢出,正溢出的符号位是01.
5.补码x0x1x2x3...xm,x0为符号位,x1为最高位数,若()当补码左移,会发生溢出
A.x0=x1
B.x0不等于x1
C.x1=0
D.x1=1
答案:B
解析:第四部分中第一种判断方法。
6.计算机字长为8位,CPU中有一个8位加法器,已知无符号数x=69,y=38,若在加法器中计算x-y,则加法器的两个输入端信息和输入的低位进位信息分别是()
A.0100 0101,0010 0110,0
B.0100 0101,1101 1001,1
C.0100 0101,1101 1010,0
D.0100 0101,1101 1010,1
答案:B
解析:x=69(10)=0100 0101(2);y=38(10)=0010 0110(2)
因为计算x-y,所以sub=1,x直接进入加法器,y需要全部取反为1101 1001
两个输入端信息:0100 0101(x)和1101 1001(-y)。低位进位信息:Cin=Sub=1.