408 知识网络
返回模块节点

CO-2 指令系统

计算机组成原理

来源:20-CO2-指令系统.md · 完整笔记(7 节,未删减)

计算机组成原理模块。软硬件的分界面:向上是程序员/编译器看到的指令,向下是 CO-4 CPU 数据通路要逐条执行的微操作。 与 CO-1 的衔接:偏移量、立即数都是补码;与 CO-4 的衔接:指令格式决定译码逻辑与指令周期。


核心问题

这一部分为什么存在?

CPU 硬件只会按节拍搬运数据,它需要一个“命令格式”来回答三个问题:做什么(操作码 OP)、对谁做(地址码指向的操作数)、怎么找到操作数(寻址方式)。指令系统就是这三者的完整约定,是硬件对软件提供的“服务清单”。

由此产生三组设计矛盾:

  1. 指令条数 vs 字长:想支持的指令多、地址字段长,但指令字长有限 → 扩展操作码(让地址少的指令“借位”给操作码)。
  2. 操作数位置多样 vs 格式统一:操作数可能在指令里、寄存器里、内存里、甚至要经过多次间接 → 用统一的“形式地址 + 寻址方式”框架计算有效地址 EA。
  3. 功能丰富 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(25=32292^5=32 \geq 29,留 3 个扩展编码),二地址可用 3×26=1921073 \times 2^6 = 192 \geq 107;指令字长 = 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. 一条指令必须回答哪三个问题?(做什么/对谁做/怎么找)
  2. 指令条数多但字长有限怎么办?扩展操作码的规则是什么?(每级留 1 个扩展标志)
  3. 操作数可能在哪些地方?各自的访存次数?
  4. 什么是形式地址和有效地址?
  5. 变址、基址、相对公式相同,本质区别是什么?(谁改寄存器、服务什么)
  6. 间接寻址为什么不属于偏移寻址?
  7. 先变址后间址和先间址后变址结果为何不同?
  8. 给定字长、指令条数、寻址方式数,怎么算地址码位数和寻址范围?(位数预算)
  9. CISC 为什么难上流水线?RISC 砍掉了什么、换来什么?
  10. RISC 为什么配硬布线控制器?(指令规整 → 译码简单 → 组合逻辑直接生成控制信号,接 CO-4)
  11. 基址寻址和 OS 的内存重定位是什么关系?(同一问题的软硬分工,接 OS-5)