说明
博客作为笔记备份,不定时更新参考内容为《计算机组成原理(第3版)》唐朔飞 高等教育出版社;王道考研《计算机组成原理考研复习指导》文中的例题摘自王道考研《计算机组成原理考研复习指导》,大多是我个人认为较为典型的题目以及错题的部分整理
文章目录
运算方法和运算电路1. 基本运算部件1.1 一位全加器1.2 串行进位加法器1.3 并行进位加法器1.4 带标志加法器1.5 算术逻辑单元 ALU 2. 定点数的移位运算2.1 算术移位2.2 逻辑移位2.3 循环移位 3. 定点数的加减运算3.1 补码的加减运算3.2 补码加减运算电路3.3 溢出判断方法 4. 定点数的乘除运算4.1 定点数的乘法运算——累加和右移原码一位乘法无符号数乘法运算电路补码一位乘法(Booth算法)补码乘法运算电路 4.2 定点数的除法运算——累加和左移符号扩展原码除法运算(不恢复余数法)补码除法运算(加减交替法)除法运算电路 5. C语言中的整数类型及类型转换5.1 有符号数和无符号数的转换5.2 不同字长整数之间的转换大字长 → 转换为 \stackrel{转换为}{\rightarrow} →转换为小字长小字长 → 转换为 \stackrel{转换为}{\rightarrow} →转换为大字长 6. 数据的存储和排列6.1 大端/小端存储方式6.2 边界对齐存储方式 7. 例题更新文档
运算方法和运算电路
1. 基本运算部件
运算器的组成:算术逻辑单元ALU、移位器、状态寄存器、通用寄存器等运算器的基本功能:加减乘除四则运算;与、或、非、异或等逻辑运算;移位、求补等操作ALU的核心部件是加法器
1.1 一位全加器
全加器FA是最基本的加法单元 输入端:加数 A i A_i Ai、加数 B i B_i Bi、低位传来的进位 C i − 1 C_{i-1} Ci−1输出端:本位和 S i S_i Si、向高位的进位 C i C_i Ci和表达式: S i = A i ⊕ B i ⊕ C i − 1 S_i=A_i\oplus B_i\oplus C_{i-1} Si=Ai⊕Bi⊕Ci−1(输入端中有奇数个“1”时, S i = 1 S_i=1 Si=1;否则 S i = 0 S_i=0 Si=0)进位表达式: C i = A i B i + ( A i ⊕ B i ) C i − 1 C_i= A_iB_i+(A_i\oplus B_i)C_{i-1} Ci=AiBi+(Ai⊕Bi)Ci−1 ^a88851
1.2 串行进位加法器
串行进位加法器:将n个全加器相连得到的n位加法器串行进位又称行波进位,每级进位
直接依赖于前一级的进位,即进位信号是
逐级形成的由于位数有限,高位自动丢失,所以实际是模 2 n 2^n 2n的加法运算串行进位加法器的最长运算时间主要是由
进位信号的传递时间决定的,位数越多延迟时间就越长,全加器本身的求和延迟仅为次要因素
1.3 并行进位加法器
令 G i = A i B i G_i=A_iB_i Gi=AiBi, P i = A i ⊕ B i P_i=A_i\oplus B_i Pi=Ai⊕Bi,则全加器的进位表达式变为: C i = G i + P i C i − 1 C_i=G_i+P_iC_{i-1} Ci=Gi+PiCi−1( G i = 1 G_i=1 Gi=1或 P i C i − 1 = 1 P_iC_{i-1}=1 PiCi−1=1时, C i = 1 C_i=1 Ci=1)![[#^a88851]]
C 1 = G 1 + P 1 C 0 C 2 = G 2 + P 2 C 1 = G 2 + P 2 G 1 + P 2 P 1 C 0 C 3 = G 3 + P 3 C 2 = G 3 + P 3 G 2 + P 3 P 2 G 1 + P 3 P 2 P 1 C 0 C 4 = G 4 + P 4 C 3 = G 4 + P 4 G 3 + P 4 P 3 G 2 + P 4 P 3 P 2 G 1 + P 4 P 3 P 2 P 1 C 0 \begin{gathered} C_1=G_1+P_1C_0 \\ C_2=G_2+P_2C_1=G_2+P_2G_1+P_2P_1C_0\\ C_3=G_3+P_3C_2=G_3+P_3G_2+P_3P_2G_1+P_3P_2P_1C_0\\ C_4=G_4+P_4C_3=G_4+P_4G_3+P_4P_3G_2+P_4P_3P_2G_1+P_4P_3P_2P_1C_0 \end{gathered} C1=G1+P1C0C2=G2+P2C1=G2+P2G1+P2P1C0C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0
C i C_i Ci仅与 A i 、 B i 、 C 0 A_i、B_i、C_0 Ai、Bi、C0有关,相互之间的进位没有依赖关系
实现上述逻辑表达式的电路称为先行进位部件CLA,通过这种进位方式实现的加法器称为全先行进位加法器
随着加法器位数的增加, C i C_i Ci的逻辑表达式会变得很复杂,会使电路结构也变得很复杂,更多位数的加法器可通过间CLA部件或全先行进位加法器串接起来实现组内先行进位,组间串行进位;组内和组间都并行进位
1.4 带标志加法器
逻辑表达式 O F = C n ⊕ C n − 1 OF = C_n\oplus C_{n-1} OF=Cn⊕Cn−1 S F = F n − 1 SF=F_{n-1} SF=Fn−1 Z F = 1 当且仅当 F = 0 ZF=1当且仅当F=0 ZF=1当且仅当F=0 C F = C o u t ⊕ C i n ,即当 C i n = 0 时, C F 为进位 C o u t , C i n = 1 时, C F 为 C o u t 取反 CF=C_{out}\oplus C_{in}, 即当C_{in}=0时,CF为进位C_{out},C_{in}=1时,CF为C_{out}取反 CF=Cout⊕Cin,即当Cin=0时,CF为进位Cout,Cin=1时,CF为Cout取反
1.5 算术逻辑单元 ALU
ALU是一种功能较强的组合逻辑电路。由于加减乘除最终都能归结为加法运算,因此ALU的核心是
带标志加法器基本结构(图2.7) 输入端 A、B:两个n位操作数 C i n C_{in} Cin:进位输入端ALUop:操作控制端,用来决定ALU所执行的处理功能 输出端 在ALUop的控制下,由MUX选择输出操作结果之一 功能:除了实现算术逻辑运算外,ALU还能实现左移或右移的移位操作
2. 定点数的移位运算
2.1 算术移位
算术移位的对象是
有符号数,在移位的过程中
符号位保持不变分析由原码得到补码的过程发现,当对其由低位向高位找到第一个1时,在此1左边各位都与对应的反码相同,而在此1右边的各位(包括这个1)均与对应的原码相同。因此负数的补码左移时,因空位出现在低位,则添补的代码与原码相同,即添0;右移时因为空位出现在高位,则添补的代码与反码相同,即添1
2.2 逻辑移位
逻辑移位将操作数视为
无符号数逻辑左移,高位移丢,低位添0;逻辑右移,低位移丢,高位添0
2.3 循环移位
3. 定点数的加减运算
3.1 补码的加减运算
[ A + B ] 补 = [ A ] 补 + [ B ] 补 ( m o d 2 n + 1 ) [ A − B ] 补 = [ A ] 补 + [ − B ] 补 ( m o d 2 n + 1 ) \begin{gather} [A+B]_补=[A]_补+[B]_补\ \ (mod 2^{n+1}) \\ [A-B]_补=[A]_补+[-B]_补\ \ (mod 2^{n+1}) \end{gather} [A+B]补=[A]补+[B]补(mod2n+1)[A−B]补=[A]补+[−B]补(mod2n+1)
逢二进一加法,两数的补码直接相加;减法,被减数与减数的机器负数相加符号位与数值位一起参与运算,加减运算结果的符号位也在运算中直接得出最终运算结果的高位丢弃,保留结果为n+1位,运算结果也是补码
3.2 补码加减运算电路
电路的设计 一个数的补码为 Y Y Y,则这个数的负数的补码为 Y ‾ + 1 \overline{Y}+1 Y+1,可在原加法器的 Y Y Y输入端加n个反向器以实现各位取反的功能2选1多路选择器:用一个控制端 S u b Sub Sub来控制,以选择是将原码 Y Y Y输入加法器还是将 Y ‾ \overline{Y} Y输入加法器,并将控制端 S u b Sub Sub同时作为低位进位送到加法器如图2.10所示,当 S u b Sub Sub为1,做减法 X + Y ‾ + 1 = [ x ] 补 + [ − y ] 补 X+\overline{Y}+1=[x]_补+[-y]_补 X+Y+1=[x]补+[−y]补;当 S u b Sub Sub为0,做加法 X + Y = [ x ] 补 + [ y ] 补 X+Y=[x]_补+[y]_补 X+Y=[x]补+[y]补 可通过标志信息区分带符号整数运算和无符号整数运算![[指令系统#^590eac]]
3.3 溢出判断方法
仅当两个
符号相同的数
相加或两个
符号相异的数
相减才可能产生溢出补码定点数加减运算溢出判断方法
采用一位符号位无论是加法还是减法,参与运算的两个数符号相同,结果与原操作数符号不同则溢出 V = A S B S S S ‾ + A S ‾ B S ‾ S S V=A_SB_S\overline{S_S}+\overline{A_S}\overline{B_S}S_S V=ASBSSS+ASBSSS,V=0时无溢出;V=1有溢出
采用双符号位(模4补码) S S 1 S S 2 = 00 S_{S_1}S_{S2}=00 SS1SS2=00:结果为正数,无溢出 S S 1 S S 2 = 01 S_{S_1}S_{S2}=01 SS1SS2=01:结果正溢出 S S 1 S S 2 = 10 S_{S_1}S_{S2}=10 SS1SS2=10:结果负溢出 S S 1 S S 2 = 11 S_{S_1}S_{S2}=11 SS1SS2=11:结果为负数,无溢出溢出逻辑判断: V = S S 1 ⊕ S S 2 V=S_{S_1}\oplus S_{S_2} V=SS1⊕SS2,若V=0,无溢出;若V=1,有溢出
采用一位符号位根据数据位的进位情况判断溢出若符号位的进位 C S C_S CS与最高数位的进位 C 1 C_1 C1相同,则无溢出;否则有溢出溢出逻辑判断: V = C S ⊕ C 1 V=C_S\oplus C_1 V=CS⊕C1。V=0,无溢出;V=1,有溢出
4. 定点数的乘除运算
4.1 定点数的乘法运算——累加和右移
原码一位乘法
原码一位乘的符号位和数值位分开运算。乘积符号由两个数的符号位异或得到;乘积的数值部分由两个数的绝对值相乘得到运算规则:设 [ X ] 原 = x s , x 1 x 2 ⋅ ⋅ ⋅ x n , [ Y ] 原 = y s , y 1 y 2 ⋅ ⋅ ⋅ y n [X]_原=x_s,x_1x_2···x_n, [Y]_原=y_s,y_1y_2···y_n [X]原=xs,x1x2⋅⋅⋅xn,[Y]原=ys,y1y2⋅⋅⋅yn 符号位 x s ⊕ y s x_s\oplus y_s xs⊕ys部分积是乘法过程中的中间结果。乘数的每一位 y i y_i yi乘以被乘数得到 X × y i X\times y_i X×yi后,将该结果与前面所得的结果累加,得到的就是部分积,初始值为0从乘数的最低位 y n y_n yn开始判断:若 y n = 1 y_n=1 yn=1,则部分积加上被乘数 ∣ x ∣ |x| ∣x∣,然后右移一位(逻辑右移);若 y n = 0 y_n=0 yn=0,则部分积加上0,然后右移一位(逻辑右移)重复步骤3,判断n次 考虑到运算过程中部分积和乘数做加法时,可能出现部分积大于1的情况(产生进位),但此时并非溢出,所以部分积和被乘数采用
双符号位无符号数乘法运算电路
部分积和被乘数X做无符号数加法时,可能产生进位,因此设置一个专门的进位位C乘积寄存器P的初始值为0;计数器 C n C_n Cn的初始值为32,每循环一次减一ALU对乘积寄存器P和被乘数寄存器X的内容做
无符号加法运算,运算结果送回
P中,进位存放在C中每次循环都对进位位C、乘积寄存器P、乘数寄存器Y实现
同步逻辑右移,此时,进位位C移入寄存器P的最高位,寄存器Y的最低位移出每次从寄存器Y移出的最低位会送到控制逻辑,以决定被乘数是否“加”到部分积上
补码一位乘法(Booth算法)
符号位参与运算,采用相加和相减操作计算补码的乘积运算规则:设 [ X ] 补 = x s , x 1 x 2 ⋅ ⋅ ⋅ x n , [ Y ] 补 = y s , y 1 y 2 ⋅ ⋅ ⋅ y n [X]_补=x_s,x_1x_2···x_n, [Y]_补=y_s,y_1y_2···y_n [X]补=xs,x1x2⋅⋅⋅xn,[Y]补=ys,y1y2⋅⋅⋅yn 符号位参与运算,运算的数均以补码表示被乘数一般采用双符号位参与运算;部分积取双符号位,初始值为0;乘数取单符号位乘数末位增设附加位 y n + 1 y_{n+1} yn+1,初值为0根据( y n y n + 1 y_ny_{n+1} ynyn+1)的取指确定操作,Booth算法的移位规则(移位按补码右移规则进行)按照上述算法执行n+1次,但第n+1步不再进行移位(共进行n+1次累加和n次右移),仅根据 y n y_n yn和 y n + 1 y_{n+1} yn+1的比较结果做相应的运算
补码乘法运算电路
因为是带符号数运算,因此不用设置专门的进位位每次循环,乘积寄存器P和乘数寄存器X同步实现
算术右移,每次根据从寄存器Y移出的最低位和它的前一位来决定是 − [ x ] 补 、 + [ x ] 补 、还是 + 0 -[x]_补、+[x]_补、还是+0 −[x]补、+[x]补、还是+0
4.2 定点数的除法运算——累加和左移
符号扩展
正数:符号位不变,扩展位都用0填充负数 原码表示的负数的符号扩展方式与正数相同,但此时符号位为1补码:原有形式的符号位移动到新形式的符号位上,其余所有附加位都用1(对于整数)或0(对于小数)填充
原码除法运算(不恢复余数法)
商符和商值分开进行,减法操作采用补码加法实现运算规则:设 [ X ] 原 = x s , x 1 x 2 ⋅ ⋅ ⋅ x n , [ Y ] 原 = y s , y 1 y 2 ⋅ ⋅ ⋅ y n [X]_原=x_s,x_1x_2···x_n, [Y]_原=y_s,y_1y_2···y_n [X]原=xs,x1x2⋅⋅⋅xn,[Y]原=ys,y1y2⋅⋅⋅yn 商符: Q s = x s ⊕ y s Q_s=x_s\oplus y_s Qs=xs⊕ys商值: ∣ Q ∣ = ∣ X ∣ / ∣ Y ∣ |Q|=|X|/|Y| ∣Q∣=∣X∣/∣Y∣ 先用被除数减去除数,当余数为正时,商上1,余数和商左移一位,再
减去除数;当余数为负时,商上0,余数和商左移一位,再
加上除数当第n+1步余数为负时,要加上 ∣ Y ∣ |Y| ∣Y∣得到第n+1步正确的余数(余数与被除数同号)
补码除法运算(加减交替法)
符号位与数值位一起运算,商符自然形成除法第一步根据被除数和除数的符号决定是做加法还是减法上商的原则根据余数和除数的符号位共同决定,同号上商1,异号上商0最后一步商恒置“1”运算规则:设 [ X ] 补 = x s , x 1 x 2 ⋅ ⋅ ⋅ x n , [ Y ] 补 = y s , y 1 y 2 ⋅ ⋅ ⋅ y n [X]_补=x_s,x_1x_2···x_n, [Y]_补=y_s,y_1y_2···y_n [X]补=xs,x1x2⋅⋅⋅xn,[Y]补=ys,y1y2⋅⋅⋅yn 符号位参与运算,除数、被除数、商、余数均用补码表示若被除数与除数同号,则被除数减去除数;异号,则被除数加上除数若余数和除数同号,则商上1,余数左移一位减去除数;若余数与除数异号,则商上0,余数左移一位加上除数重复执行第3步n次若对商的精度没有特殊要求,一般采用“末位恒置1”法
除法运算电路
初始时,寄存器R存放
扩展被除数的
高位部分,寄存器Q存放
扩展被除数的
低位部分ALU对余数寄存器R和除数寄存器Y的内容做加/减运算,结果送回寄存器R中每次循环,寄存器R和Q实现同步
左移,左移时,Q的最高位移入R的最低位,Q中
空出的最低位被上商每次由控制逻辑根据ALU运算结果的符号来决定是上商0还是1
5. C语言中的整数类型及类型转换
5.1 有符号数和无符号数的转换
强制类型转换的结果
保持位值不变,仅改变了
解释这些位的方式5.2 不同字长整数之间的转换
大字长 → 转换为 \stackrel{转换为}{\rightarrow} →转换为小字长
系统把多余的高位部分
直接截断,低位直接赋值
小字长 → 转换为 \stackrel{转换为}{\rightarrow} →转换为大字长
不仅要保证相应的位值相等,还要对高位部分进行扩展 若原数字是无符号整数,则进行
零扩展,扩展后的高位部分用0填充若原数字是有符号整数,则进行
符号扩展,扩展后的高位部分用原数字符号位填充
6. 数据的存储和排列
6.1 大端/小端存储方式
大端方式:最高有效字节存到低地址中,最低有效字节存到高地址中小端方式:最高有效字节存到高地址中,最低有效字节存到低地址中
6.2 边界对齐存储方式
对于机器字长为32位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4的整数倍,这样无论取字节、字还是半字,均可一次访存取出若存储的数据不满足上述要求,可通过填充空白字节使其符合要求边界对齐方式是一种
空间换时间的思想RISC通常采用边界对齐方式,因为对齐方式取指令时间相同,因此能适应指令流水
7. 例题
更新文档