1. 指令系统的分类

image-20251027234033760

C=A+B为例说明不同指令系统的特性

  • 堆栈型

计算只能从栈顶拿数据,计算完也只能放回栈顶。

代码:

Push A (内存 \to 堆栈)

Push B (内存 \to 堆栈)

Add ([计算数]堆栈 \to ALU \to [计算结果]堆栈)

Pop C (堆栈 \to 内存)

  • 累加器型

一个操作数必须来自累加器,另一个操作数必须来自内存。结果必须放回累加器

代码:

Load A (内存 A \to 累加器)

Add B (累加器 + 内存 B \to ALU \to 累加器)

Store C (累加器 \to 内存 C)

  • 寄存器型

    • 寄存器-内存型

    累加器型的“升级版”。计算时,一个操作数来自任意寄存器,另一个可以来自内存。

    代码:

    Load R1, A (内存 A \to 寄存器 R1)

    Add R3, R1, B (R1 + 内存 B \to ALU \to 寄存器 R3)

    Store R3, C (寄存器 R3 \to 内存 C)

    • 寄存器-寄存器型

      ⭐RISC核心:快慢分离。ALU只做快速计算;内存只负责慢速访问

    ALU不能直接访问内存。所有操作数必须先从内存 Load到寄存器中

    代码:

    Load R1, A (内存 A \to 寄存器 R1)

    Load R2, B (内存 B \to 寄存器 R2)

    Add R3, R1, R2 (寄存器 R1 + 寄存器 R2 \to ALU \to 寄存器 R3) Store R3, C (寄存器 R3 \to 内存 C)

2.寻址方式

image-20251110144458277

3. 控制指令

①跳转指令:无条件改变控制流

②分支指令:有条件改变控制流

改变控制流大多是分支指令(条件跳转)

分三种

  • 条件码
  • 条件寄存器(主流)
  • 比较与分支

4. 指令操作码的优化

指令 =操作码+地址码

优化:如何用最短的位数来表示指令信息

  • 最短平均码长(信息熵)H=pilog2piH = -\sum p_i \log_2 p_i

    理论可达的平均最短码长

  • 平均码长

L=piliL=\sum p_i l_i

  • 信息冗余量

    LHL\frac{L-H}{L}

①霍夫曼编码

除该码外还有一种利用霍夫曼概念的拓展操作码

image-20251112161347098

方法:先读取前两位,若是00/01/10则确定是2位操作码,若是11则继续读两位,重复…

②等长扩展码

③定长扩展码

5. 指令字格式的优化