3.5 指令系统的发展
本节探讨指令系统设计的演进,包括操作码的优化方法以及从复杂指令集到精简指令集的转变。
3.5.1 指令操作码的优化
目标: 在满足所有指令编码的前提下,使操作码字段的平均长度最短,从而节省程序存储空间。
哈夫曼编码 (Huffman Coding):
- 原则: 对使用频率高的指令分配较短的操作码,对使用频率低的指令分配较长的操作码。
- 特点: 是一种理论上最优的编码方法,可以得到最短的平均码长。但生成的编码长度不规整,硬件译码困难。
扩展操作码法:
- 是哈夫曼思想的一种工程实践。它将指令按地址数量或使用频率分组,为高频或地址多的指令分配短码,为低频或地址少的指令分配长码。
- 比哈夫曼编码规整,更易于硬件实现。
3.5.2 从复杂指令系统到精简指令系统 (CISC vs. RISC)
1. 复杂指令系统计算机 (CISC - Complex Instruction Set Computer)
- 设计思想: 增强指令功能,用一条复杂的指令代替一串简单的指令,力图缩小高级语言与机器语言的"语义差距"。
- 特点:
- 指令数量多,功能复杂。
- 指令长度可变,格式多样。
- 支持多种复杂的寻址方式。
- 控制器大多采用微程序控制。
2. 精简指令系统计算机 (RISC - Reduced Instruction Set Computer)
- 设计思想: 基于 "80-20" 原则(程序中80%的时间在执行20%的简单指令),简化指令系统,提高执行效率。将复杂功能交给编译器用简单指令组合实现。
- 特点:
- 指令数量少,功能单一。
- 指令长度固定,格式规整。
- 寻址方式少,通常只有
LOAD/STORE指令能访问内存。 - 大量使用寄存器,采用 "Load-Store" 结构。
- 控制器大多采用硬布线逻辑,易于实现指令流水线。
CISC 与 RISC 对比
| 特性 | CISC (复杂指令集) | RISC (精简指令集) |
|---|---|---|
| 指令系统 | 复杂、庞大 (>200条) | 简单、精简 (<100条) |
| 指令长度 | 不固定 | 固定 |
| 寻址方式 | 多 (>4种) | 少 (<4种) |
| 访存指令 | 无限制 | 仅 LOAD 和 STORE 指令 |
| 通用寄存器 | 较少 | 较多 |
| 控制器 | 微程序控制 | 组合逻辑控制 (硬布线) |
| 编译优化 | 较难 | 容易 |
| 执行效率 | 单条指令执行时间相差大 | 绝大多数指令在一个时钟周期内完成 |
3.5.3 设计RISC的关键技术
重叠寄存器窗口 (Overlapping Register Windows):
- 目的: 加快子程序调用时的参数传递和现场保存。
- 方法: CPU内设置大量寄存器,并划分为多个"窗口"。调用子程序时,切换窗口,通过让父程序和子程序的窗口部分重叠来实现快速的参数传递,避免了频繁访存。
延迟转移技术 (Delayed Branch):
- 目的: 解决流水线中由转移指令引起的"断流"问题。
- 方法: 编译器在转移指令之后插入一条或多条与转移结果无关的有效指令(称为延迟槽指令)。无论转移是否发生,这些指令都会被执行,从而填补了流水线的空闲,提高了效率。
指令流调整和编译优化:
- RISC 的性能在很大程度上依赖于编译器的优化能力。编译器负责将高级语言高效地翻译成简单的RISC指令序列,并通过指令调度来解决数据相关、资源冲突等流水线问题。
易考点和难点
易考点
- 核心考点: CISC和RISC的特点对比。这是一个非常经典的考点,需要熟记对比表格中的各项内容。
- 易考点: 理解RISC为提高流水线效率而采用的关键技术,特别是延迟转移的基本思想。
难点
- 难点: 深入理解重叠寄存器窗口的工作原理和延迟转移的实现细节。