3.9 KiB
3.9 KiB
tags, create time
| tags | create time | |||
|---|---|---|---|---|
|
2026-06-15 10:00 |
指令系统设计
概述
本文档讲解指令系统(ISA)的设计原则与编码技术,包括指令格式设计、操作码编码(定长/扩展)、RISC vs CISC 的核心差异。指令系统是软硬件的分界面,其设计直接影响计算机的性能和可编程性。
[!tip] 考试重点 扩展操作码的指令格式设计是分析题高频考点,需掌握定长操作码与等长扩展码的计算方法。RISC 原则常以选择题形式出现。
正文
一、指令格式设计
一条指令通常由操作码和地址码组成:
┌──────────┬──────────┬──────────┬──────────┐
│ 操作码 │ 地址1 │ 地址2 │ 地址3 │
└──────────┴──────────┴──────────┴──────────┘
指令字长 = 操作码位数 + 各地址码位数之和
[!question] 为什么指令格式设计需要权衡? 操作码越长,可表示的指令种类越多,但地址码空间被压缩;地址码越多,寻址能力越强,但指令字长增加,取指开销增大。
二、操作码编码方式
2.1 定长操作码
所有指令的操作码位数相同,格式规整,译码简单。
例:指令字长 16 位,地址字段 6 位,双地址指令需 16 - 6 \times 2 = 4 位操作码 → 最多 2^4 = 16 条指令。
2.2 扩展操作码(变长操作码)
通过在操作码中设置扩展标志位,使不同类型的指令拥有不同长度的操作码,从而在固定指令字长下支持更多指令。
设计原则:
- 使用频率高的指令分配短操作码
- 使用频率低的指令分配长操作码
- 短操作码不能是长操作码的前缀
[!example] 例:12 位指令字长,3 位地址字段
类型 操作码 地址数 可用编码空间 三地址 3 位 3 $2^3 = 8$(用 4 个) 二地址 6 位 2 余下 4 个 × $2^3 = 32$(用 8 个) 单地址 9 位 1 余下编码 × 2^3 = 190条
三、RISC vs CISC
| 特性 | RISC | CISC |
|---|---|---|
| 指令数量 | 少(< 200) | 多(数百~上千) |
| 指令长度 | 等长(通常 32 位) | 变长 |
| 寻址方式 | 少(2~3 种) | 多(十几种) |
| 执行周期 | 单周期为主 | 多周期 |
| 访存方式 | Load-Store(仅 load/store 访存) | 任意指令可访存 |
| 控制方式 | 硬连线(速度快) | 微程序(灵活) |
| 寄存器 | 多(32+ 通用寄存器) | 少 |
| 编译器 | 依赖编译器优化 | 硬件承担更多 |
[!warning] RISC 的常见误解
- RISC 不是"指令功能简单",而是"指令数量少、格式规整"
- RISC 的单周期是指理想情况,Cache 不命中等仍会导致多周期
- RISC 使用 Load-Store 架构,ALU 操作只在寄存器间进行
[!question] 为什么 RISC 采用 Load-Store 架构? 将访存操作限制在专用的 load/store 指令中,使得其他所有指令都只访问寄存器,速度更快、时序更简单,有利于流水线实现。同时,编译器可以更方便地调度指令顺序来隐藏访存延迟。
四、寻址方式
| 寻址方式 | 有效地址 | 适用场景 |
|---|---|---|
| 立即寻址 | 操作数在指令中 | 常量赋值 |
| 寄存器寻址 | EA = R | 高速操作 |
| 直接寻址 | EA = A | 全局变量 |
| 间接寻址 | EA = (A) | 指针 |
| 基址寻址 | EA = R + A | 数组基址 |
| 变址寻址 | EA = A + R | 数组下标 |