计算机组成原理模块。软硬件的分界面:向上是程序员/编译器看到的指令,向下是 CO-4 CPU 数据通路要逐条执行的微操作。 与 CO-1 的衔接:偏移量、立即数都是补码;与 CO-4 的衔接:指令格式决定译码逻辑与指令周期。
核心问题
这一部分为什么存在?
CPU 硬件只会按节拍搬运数据,它需要一个“命令格式”来回答三个问题:做什么(操作码 OP)、对谁做(地址码指向的操作数)、怎么找到操作数(寻址方式)。指令系统就是这三者的完整约定,是硬件对软件提供的“服务清单”。
由此产生三组设计矛盾:
- 指令条数 vs 字长:想支持的指令多、地址字段长,但指令字长有限 → 扩展操作码(让地址少的指令“借位”给操作码)。
- 操作数位置多样 vs 格式统一:操作数可能在指令里、寄存器里、内存里、甚至要经过多次间接 → 用统一的“形式地址 + 寻址方式”框架计算有效地址 EA。
- 功能丰富 vs 硬件规整:CISC 给编译器准备豪华指令(变长、多寻址),但译码复杂、难以流水;RISC 砍到最小集(定长、仅 Load/Store 访存),换取单周期与流水线友好——这场路线之争直接决定了 CO-4/CO-5 的硬件形态。
概念体系
flowchart TD
A["硬件只会按节拍搬数据<br/>需要命令格式"] --> B["指令 = 操作码 OP + 地址码 A"]
B --> C["指令条数 vs 字长<br/>→ 扩展操作码"]
B --> D["操作数在哪?<br/>→ 寻址方式 → 有效地址 EA"]
D --> E["立即 / 直接 / 间接<br/>寄存器 / 寄存器间接 / 隐含"]
D --> F["偏移寻址三兄弟<br/>变址(数组)/ 基址(浮动)/ 相对(转移)"]
B --> G["设计路线之争<br/>CISC vs RISC"]
G --> H["RISC:定长、少寻址、Load/Store<br/>→ 硬布线 + 流水线友好"]
核心概念:
| 概念 | 要点 | 易考点 |
|---|---|---|
| 形式地址 A vs 有效地址 EA | A 是指令里的字段;EA 是真正访问的地址,由寻址方式算得 | 一切寻址计算题都是求 EA |
| 访存次数 | 为取操作数而访存的次数(不含取指) | 立即/寄存器/隐含/相对:0 次;直接/寄存器间接/变址/基址/堆栈:1 次;一次间接:2 次(来源:复习资料 P1 §一) |
| 扩展操作码 | 地址码越少的指令,操作码可以越长;每级留 1 个编码作扩展标志 | 短操作码不能与长操作码前缀冲突 |
| 偏移寻址 | EA = (某寄存器) + A | 只有基址/变址/相对属于偏移寻址,间接寻址不是(2011-16) |
| 程序员可见寄存器 | 基址寄存器、标志/状态寄存器可见;指令寄存器 IR、微指令寄存器不可见(2021-17) |
实现机制
1. 十种寻址方式与 EA 计算(来源:复习资料 P1 §一总表)
| 寻址方式 | EA | 访存次数 | 典型用途 |
|---|---|---|---|
| 立即 | 操作数 = A | 0 | 赋常数 |
| 直接 | EA = A | 1 | 固定变量 |
| 间接(一次) | EA = M[A] | 2 | 地址可变 |
| 寄存器 | 操作数 = (Ri) | 0 | 高频运算 |
| 寄存器间接 | EA = (Ri) | 1 | 指针 *p |
| 隐含 | 操作数在 ACC 等 | 0 | 累加器指令 |
| 变址 | EA = (IX) + A | 1 | 数组按下标循环(2017-15 答案) |
| 基址 | EA = (BR) + A | 1 | 程序浮动/多道程序 |
| 相对 | EA = (PC) + A | 0 | 转移指令 |
| 堆栈 | EA = (SP) | 1 | 调用/表达式 |
易混三连(变址/基址/相对):为什么易混——都是“寄存器 + 形式地址”。本质区别——谁改寄存器、为什么改:变址由用户在循环中改(IX 是下标,A 是数组基址);基址由 OS 定、用户不可改(BR 是装入基址,服务重定位);相对的“寄存器”是 PC,取指后自动推进,服务位置无关的跳转。判别线索:题目出现“数组/下标/循环”→ 变址;“程序浮动/多道”→ 基址;“转移目标”→ 相对。
- 2013-17:IX=1000H、A=2000H → EA=3000H → 操作数 = M[3000H] = 4000H。
- 2018-18:double 数组首址 2000H,取到 2100H 时变址寄存器 = (2100−2000)/8 = 32。
- 2016-17(先变址后间址 vs 先间址后变址):前者 EA = M[(IX)+D],后者 EA = M[D]+(IX)——组合顺序不同结果完全不同。
- 2014-17:32 位定长指令、16 寄存器、OP(含寻址位)8 位 → Store 偏移量字段 = 32−8−4−4 = 16 位补码 → 范围 −32768 ~ +32767。
2. 扩展操作码(2017-16 算例,来源:复习资料 P1 §二)
规则:每类指令最多留 1 个编码给下一级当扩展标志;短操作码条数越多,能扩出的长操作码越少。算例:三地址 29 条 + 二地址 107 条、地址码 6 位——三地址需 5 位 OP(,留 3 个扩展编码),二地址可用 ;指令字长 = 5+3×6 = 23 位,按字节对齐取 24 位。
3. CISC vs RISC:为什么 RISC 赢得流水线时代
CISC 的豪华指令每条执行步数不一、字长不一 → 无法整齐切成流水段;RISC 把指令裁到“定长、格式少、仅 Load/Store 访存、寄存器多”,使每条指令完美映射到统一流水段(IF/ID/EX/MEM/WB),控制器可以用硬布线(快)而非微程序。对比全表见复习资料 P1 §三;高频错误项:“RISC 普遍采用微程序控制器”(2009-17)、“RISC 难以采用流水线实现”(2025-17)——都与事实相反,因为 RISC 的设计目标就是流水线友好。
4. 指令格式与可寻址范围
2020-16:16 位定长指令、48 条指令(OP 需 6 位)、4 种寻址方式(寻址字段 2 位)→ 单地址指令地址码 = 16−6−2 = 8 位 → 直接寻址范围 0~255。这类题的统一动作:位数预算 = 字长 − OP − 寻址位 − 寄存器编号位,剩余即地址码。
方案比较
| 维度 | CISC(x86) | RISC(ARM/MIPS/RISC-V) |
|---|---|---|
| 设计哲学 | 硬件多做事,减轻编译器 | 硬件规整,复杂留给编译器 |
| 指令长度 | 变长 | 定长 |
| 访存 | 任意指令可访存 | 仅 Load/Store |
| CPI | 大(多周期) | 接近 1(大多单周期) |
| 控制器 | 微程序为主 | 硬布线为主 |
| 通用寄存器 | 少 | 多 |
| 流水线 | 难 | 易(设计目标) |
来源:复习资料 P1 §三。
变址 vs 基址(本模块第一易混对)再强调:二者 EA 公式同形,考试考“用途与修改权”——变址服务数组、用户可改;基址服务浮动、OS 掌管。一道题的判断:看题目语境是“数组循环”还是“程序装入”。
应用与考法
形态一:EA/操作数计算:2013-17(变址)、2016-17(复合寻址)、2018-18(数组变址反推下标)、2019-15(基址 + 大端 + 补码形式地址求 LSB 地址,与 CO-1 综合)。
形态二:指令格式位数预算:2014-17(Store 偏移量范围)、2017-16(扩展操作码求字长 24 位)、2020-16(直接寻址范围 0~255)。
形态三:寻址方式识别与用途:2011-16(间接不属于偏移寻址)、2017-15(数组用变址)、2019-17(指令执行用到哪些部件)、2024 大题(jmp/jge 的相对寻址与目标地址计算)、2015-43(bne 的 OFFSET 反推)、2010-43(寻址方式表 + 相对转移综合大题)。
形态四:CISC/RISC 辨析:2009-17、2017-44(由指令特征判断机器是 RISC 还是 CISC)、2025-17。
做题触发词:看到“转移目标地址”→ (PC)+A(注意 PC 已指向下一条);看到“数组下标”→ 变址;看到“多少条指令/几种寻址”→ 位数预算;看到“定长指令 + 寄存器多”→ RISC。
来源:真题markdown/2009-2024统考真题.md、2025 年真题 md;复习资料 P1 §一–三。
前后联系
- 向前依赖:CO-1(补码偏移量、大端小端、边界对齐——2019-15 正是三者综合)。
- 向后引出:
- 指令译码后如何执行 → CO-4 指令周期与数据通路(每条指令的微操作序列);
- RISC 的定长与规整 → CO-5 流水线的前提;
- 基址寻址服务程序浮动 → OS-5 重定位(同一思想的软硬两面);相对寻址的位置无关代码 → 链接装入(理解级);
- 指令中的转移 → 流水线控制相关(CO-5)。
闭卷回忆链
- 一条指令必须回答哪三个问题?(做什么/对谁做/怎么找)
- 指令条数多但字长有限怎么办?扩展操作码的规则是什么?(每级留 1 个扩展标志)
- 操作数可能在哪些地方?各自的访存次数?
- 什么是形式地址和有效地址?
- 变址、基址、相对公式相同,本质区别是什么?(谁改寄存器、服务什么)
- 间接寻址为什么不属于偏移寻址?
- 先变址后间址和先间址后变址结果为何不同?
- 给定字长、指令条数、寻址方式数,怎么算地址码位数和寻址范围?(位数预算)
- CISC 为什么难上流水线?RISC 砍掉了什么、换来什么?
- RISC 为什么配硬布线控制器?(指令规整 → 译码简单 → 组合逻辑直接生成控制信号,接 CO-4)
- 基址寻址和 OS 的内存重定位是什么关系?(同一问题的软硬分工,接 OS-5)