3.1 布尔代数和基本逻辑电路&无符号数加法器&整数加减运算器和ALU

  1. 布尔代数基本定义:
  • 0和1分别表示逻辑值的假和真
  • 通过逻辑关系可以构建基于0和1的布尔代数运算
  • 最基本的逻辑运算有:与(AND)、或(OR)、非(NOT)
  • 真值表可以反映输入和输出之间的关系
  1. 逻辑运算可以通过逻辑门电路实现:与门、或门、非门。假使我们要进行按n位逻辑运算,则需要n个逻辑门

  2. 逻辑电路有以下两种类型:

  • 组合逻辑电路:没有存储功能,输出依赖于当前输入。
  • 时序逻辑电路:具有存储功能,输出不仅依赖于当前输入。
  • 功能部件:用逻辑门电路组成的带有特定功能的组合逻辑部件。
  1. 一位加法器称为全加器(n位加法器可以直接用若干个全加器实现,但是在这种情况只能实现无符号的整数加法):
  • 两个加数为A和B,低位进位为Cin,和为F,向高位的进位为Cout。
  • 不考虑低位进位的加法器叫半加器。
  1. n位带标志加法器:
  • 溢出标志OF:OF = Cn ^ Cn-1
  • 符号标志SF:SF = Fn-1
  • 零标志ZF:当且仅当F = 0时ZF = 1
  • 进位/借位标志CF:CF = Cout ^ Cin
  1. n位整数加/减运算器:
  • [ A + B ]补 = [ A ]补 + [ B ]补(mod 2^n)
  • [ A - B ]补 = [ A ]补 + [ -B ]补(mod 2^n)
    运用这样的逻辑并加上带标志加法器,可以进行无符号整数加、无符号整数减、带符号整数加和带符号整数减。在加减部件的基础上,加上寄存器、移位器和控制逻辑,就能够实现ALU、乘除运算和浮点运算电路。
  1. 算术逻辑部件(ALU):
  • 能够进行基本算数运算和逻辑运算
    • 无符号整数加减
    • 带符号整数加减
    • 与、或、非、异或等逻辑运算
  • 核心电路是带标志加法器
  • 输出除和/差等,还有标志信息
  • 有一个操作控制端(ALUop),用来决定具体运算操作。

3.2 从C表达式到逻辑电路

C语言中的基本数据类型:

  • 无符号数(二进制位串)、带符号整数(补码)
  • 浮点数(IEEE 754标准)
  • 位串、字符(串)(ASCII码)
    C语言中的基本运算类型:
  • 算术
  • 按位
  • 逻辑
  • 移位
  • 扩展和截断(类型转换时会用到)

指令集中涉及到的运算

  • 涉及到的定点数运算
    • 算术运算
      • 带符号整数:取负/符号扩展/加减乘除/算术移位
      • 无符号整数:0扩展/加减乘除/逻辑左移/逻辑右移
    • 逻辑运算
      • 逻辑操作:与或非…
  • 涉及到的浮点数运算:加减乘除

指令集中的运算操作在运算电路中进行:

  • 基本运算部件ALU、通用寄存器组和其他部件

高级运算操作先转换成指令,再在计算机中的逻辑门电路进行运算。

3.3 C语言中的各类运算

本节是对上一小节中提到的运算进行展开解释,直接放图。

Alt text

Alt text

Alt text

Alt text

3.4 加减运算生成的标志信息

C语言中的整数有:

  • 带符号整数:char, short, int, long
  • 无符号整数:unsigned char, unsigned short, unsigned

指针和地址通常是无符号整数,进行指针或地址的运算就是进行无符号整数的加减运算。
无符号整数和带符号整数的加减运算电路相同,运算电路称为整数加减运算部件,都基于带标志加法器实现。计算机中的加法器是一种模2^n运算系统。

补码加减运算要点和运算部件:

  • 加减运算统一用加法处理。
  • 符号位和数值位一起参与运算。
  • 计算机中所有运算都基于加法器实现。
  • 加法器不知道运算的是带符号数或无符号数。
  • 加法器不知道运算结果是否正确。

在c语言中通常会有分支指令(条件转移指令,如if),而条件标志(Flag)在运算电路中产生,被记录到程序/状态字寄存器或标志寄存器中,每个标志对应标志寄存器中的一个标志位。

n位带标志加法器:

  • 无法用于两个n位带符号整数(补码)相加,因为无法判断是否溢出。
  • 程序中比较大小的操作通过在加法器中做减法得到的标志信息进行判断。
    无符号加溢出条件:CF = 1
    带符号加溢出条件:OF = 1
    带符号减溢出条件:
  • 最高位和次高位的进位不同
  • 和的符号位和加数的符号位不同
    无符号减溢出:
  • 差为负数(CF = 1)