计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)

说明

  1. 博客作为笔记备份,不定时更新
  2. 参考内容为《计算机组成原理(第3版)》唐朔飞 高等教育出版社;王道考研《计算机组成原理考研复习指导2023》
  3. 文中的例题摘自王道考研《计算机组成原理考研复习指导2023》,大多是我个人认为较为典型的题目以及错题的部分整理

文章目录

  • 运算方法和运算电路
    • 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 一位全加器

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第1张图片

  • 全加器FA是最基本的加法单元
    • 输入端:加数 A i A_i Ai、加数 B i B_i Bi、低位传来的进位 C i − 1 C_{i-1} Ci1
    • 输出端:本位和 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=AiBiCi1(输入端中有奇数个“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+(AiBi)Ci1 ^a88851

1.2 串行进位加法器

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第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=AiBi,则全加器的进位表达式变为: C i = G i + P i C i − 1 C_i=G_i+P_iC_{i-1} Ci=Gi+PiCi1 G i = 1 G_i=1 Gi=1 P i C i − 1 = 1 P_iC_{i-1}=1 PiCi1=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 AiBiC0有关,相互之间的进位没有依赖关系
  • 实现上述逻辑表达式的电路称为先行进位部件CLA,通过这种进位方式实现的加法器称为全先行进位加法器
    计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第3张图片

    • 随着加法器位数的增加, C i C_i Ci的逻辑表达式会变得很复杂,会使电路结构也变得很复杂,更多位数的加法器可通过间CLA部件或全先行进位加法器串接起来实现
    • 组内先行进位,组间串行进位;组内和组间都并行进位

1.4 带标志加法器

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第4张图片

  • 逻辑表达式
    • O F = C n ⊕ C n − 1 OF = C_n\oplus C_{n-1} OF=CnCn1
    • S F = F n − 1 SF=F_{n-1} SF=Fn1
    • 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=CoutCin,即当Cin=0时,CF为进位CoutCin=1时,CFCout取反

1.5 算术逻辑单元 ALU

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第5张图片

  • ALU是一种功能较强的组合逻辑电路。由于加减乘除最终都能归结为加法运算,因此ALU的核心是带标志加法器
  • 基本结构(图2.7)
    • 输入端
      • A、B:两个n位操作数
      • C i n C_{in} Cin:进位输入端
      • ALUop:操作控制端,用来决定ALU所执行的处理功能
    • 输出端
      • 在ALUop的控制下,由MUX选择输出操作结果之一
  • 功能:除了实现算术逻辑运算外,ALU还能实现左移或右移的移位操作

2. 定点数的移位运算

2.1 算术移位

  • 算术移位的对象是有符号数,在移位的过程中符号位保持不变
正数/负数 码制 填补
正数 原码、补码、反码 0
负数 原码 0
负数 补码 左移添0
负数 补码 右移添1
负数 反码 1
  • 分析由原码得到补码的过程发现,当对其由低位向高位找到第一个1时,在此1左边各位都与对应的反码相同,而在此1右边的各位(包括这个1)均与对应的原码相同。因此负数的补码左移时,因空位出现在低位,则添补的代码与原码相同,即添0;右移时因为空位出现在高位,则添补的代码与反码相同,即添1

2.2 逻辑移位

  • 逻辑移位将操作数视为无符号数
  • 逻辑左移,高位移丢,低位添0;逻辑右移,低位移丢,高位添0

2.3 循环移位

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第6张图片

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[AB]=[A]+[B]  mod2n+1

  • 逢二进一
  • 加法,两数的补码直接相加;减法,被减数与减数的机器负数相加
  • 符号位与数值位一起参与运算,加减运算结果的符号位也在运算中直接得出
  • 最终运算结果的高位丢弃,保留结果为n+1位,运算结果也是补码

3.2 补码加减运算电路

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第7张图片

  • 电路的设计
    • 一个数的补码为 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=SS1SS2,若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=CSC1。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
    1. 符号位 x s ⊕ y s x_s\oplus y_s xsys
    2. 部分积是乘法过程中的中间结果。乘数的每一位 y i y_i yi乘以被乘数得到 X × y i X\times y_i X×yi后,将该结果与前面所得的结果累加,得到的就是部分积,初始值为0
    3. 从乘数的最低位 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,然后右移一位(逻辑右移)
    4. 重复步骤3,判断n次
  • 考虑到运算过程中部分积和乘数做加法时,可能出现部分积大于1的情况(产生进位),但此时并非溢出,所以部分积和被乘数采用双符号位

无符号数乘法运算电路

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第8张图片

  • 部分积和被乘数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
  1. 符号位参与运算,运算的数均以补码表示
  2. 被乘数一般采用双符号位参与运算;部分积取双符号位,初始值为0;乘数取单符号位
  3. 乘数末位增设附加位 y n + 1 y_{n+1} yn+1,初值为0
  4. 根据( y n y n + 1 y_ny_{n+1} ynyn+1)的取指确定操作,Booth算法的移位规则(移位按补码右移规则进行)
y n y_n yn (高位) y n + 1 y_{n+1} yn+1(低位) 操作
0 0 部分积右移一位
0 1 部分积加上 [ X ] 补 [X]_补 [X],右移一位
1 0 部分积加上 [ − X ] 补 [-X]_补 [X],右移一位
1 1 部分积右移一位
  1. 按照上述算法执行n+1次,但第n+1步不再进行移位(共进行n+1次累加和n次右移),仅根据 y n y_n yn y n + 1 y_{n+1} yn+1的比较结果做相应的运算

补码乘法运算电路

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第9张图片

  • 因为是带符号数运算,因此不用设置专门的进位位
  • 每次循环,乘积寄存器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=xsys
    • 商值: ∣ 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. 符号位参与运算,除数、被除数、商、余数均用补码表示
    2. 若被除数与除数同号,则被除数减去除数;异号,则被除数加上除数
    3. 若余数和除数同号,则商上1,余数左移一位减去除数;若余数与除数异号,则商上0,余数左移一位加上除数
    4. 重复执行第3步n次
    5. 若对商的精度没有特殊要求,一般采用“末位恒置1”法

除法运算电路

计算机组成原理——数据的表示与运算-运算方法和运算电路(课程笔记)_第10张图片

  • 初始时,寄存器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. 例题

更新文档

更新日期 更新内容

你可能感兴趣的:(课程笔记,计算机组成原理,运算方法和运算电路)