计算机组成原理第 4 章:指令系统总览
这一页只负责导航,不装内容。每个节号点进去就是那一节的完整讲义。
前三章都在硬件内部:数据怎么编码(第 2 章)、运算器怎么算(第 2 章)、存储器怎么组织(第 3 章)。第 4 章换到了另一边——软件怎么指挥硬件。
这一章的中心是一份契约:指令集体系结构(ISA)。全章结构就是把这份契约逐条展开:
先立契约本身与指令的编码(4.1)→ 再说指令怎么找到操作数(4.2)→ 然后看一段 C 程序落到指令上是什么样(4.3)→ 最后比较两种签契约的哲学(4.4)
贯穿全章有两条隐线,值得单独盯住:
① 一条指令必须自己携带自己的长度信息。 用前缀码携带不花任何存储空间(长度由操作码唯一推出),但代价是取指与译码从此串行——第 2 条指令的起点要等第 1 条译完。这条线从 4.1.4 扩展操作码起,经 4.4.1 的长度预译码,终结于 4.4.2”RISC 为什么选定长指令”。它是本章唯一一处卡点(#74)的正面答案。
② 一个地址从源码走到存储单元,要经过六层翻译。 符号 → 形式地址 → EA(逻辑地址) → 线性地址 → 物理地址 → Cache 划分 / 主存译码。相邻两层是”输出→输入”,不是同一层的两种做法——因此不能比较优劣、不能互相替代。这条线在 4.2.1 立起,往前接第 3 章的 3.3.3 / 3.5.3 / 3.6,往后接 OS 第 3 章。4.2.2 的五条连续提问全部是跨层比较造成的,这条线就是为它们准备的。
另外,第 1 章的性能公式
章节导航
4.1 指令系统 ✅
| 节 | 页面 | 一句话 |
|---|---|---|
| 4.1.1 | 指令集体系结构 | ISA / 微体系结构 / ABI 三层;判据是”改了老程序还能不能跑” |
| 4.1.2 | 指令的基本格式 | 机器字长 / 存储字长 / 指令字长三者独立;访存次数模板 |
| 4.1.3 | 定长操作码指令格式 | 优点全在时序:一级译码、字段固定、PC 增量恒定 |
| 4.1.4 | 扩展操作码指令格式 | 前缀码;递推 =(上层剩余) |
| 4.1.5 | 指令的操作类型 | 这张表就是数据通路的功能清单 |
4.2 指令的寻址方式 ✅
4.3 程序的机器级代码表示 ✅
| 节 | 页面 | 一句话 |
|---|---|---|
| 4.3.1 | 常用汇编指令介绍 | LEA 取地址不取内容;两种汇编格式看 % $ |
| 4.3.2 | 选择语句的机器级表示 | 条件是取反的;跳转表三步 |
| 4.3.3 | 循环语句的机器级表示 | 三种循环塌缩成 do-while;归纳变量替换 |
| 4.3.4 | 过程调用的机器级表示 | 四件事只有一件归 ISA;[ebp+8] 是基址寻址实战 |
4.4 CISC和RISC的基本概念 ✅
| 节 | 页面 | 一句话 |
|---|---|---|
| 4.4.1 | 复杂指令系统计算机(CISC) | 三条历史约束;复杂指令值不值看硬件有没有专用通路 |
| 4.4.2 | 精简指令系统计算机(RISC) | 精简的是每条指令的功能;Load/Store 让流水段整齐 |
| 4.4.3 | CISC 和 RISC 的比较 | 三因子方向相反 → 只给一个因子答”无法判断” |
本章高频边界
每一条点进去就是那一节里正面辨析的位置。完整清单(76 条)见 名词库末尾。
| # | 边界 | 在哪 |
|---|---|---|
| 1 | Cache / 流水线 / 控制器实现方式不属于 ISA | 4.1.1 |
| 2 | 调用约定 / 栈帧布局 / 目标文件格式属于 ABI 不属于 ISA | 4.1.1 |
| 3 | 汇编语法不属于 ISA,两种格式机器码相同 | 4.1.1 |
| 4 | 取指访存次数 = 指令字长 ÷ 存储字长(存储字长 = MDR 位数) | 4.1.2 |
| 5 | 一地址指令:双操作数型 2 次、读改写型 3 次 | 4.1.2 |
| 6 | 二地址指令结果覆盖第一个操作数 | 4.1.2 |
| 7 | 定长指令字 ≠ 定长操作码,两个维度独立 | 4.1.2 |
| 8 | 4.1.3 | |
| 9 | 扩展操作码不改变指令字长 | 4.1.4 |
| 10 | 三地址指令码短是因为地址字段挤占,不是使用频率 | 4.1.4 |
| 11 | 零地址那一层不留窗口,所以是 16 条不是 15 条 | 4.1.4 |
| 12 | 变长指令的长度由操作码隐含,不占额外位;代价在译码串行 | 4.1.4 |
| 13 | 传送类不改标志位;CMP/TEST 只改标志位不写结果 | 4.1.5 |
| 14 | RET 与 IRET 不可互换(后者恢复 PSW 与特权级) | 4.1.5 |
| 15 | TRAP 是指令、同步、自愿,不是异步事件 | 4.1.5 |
| 16 | 统一编址时没有 I/O 指令也能做 I/O | 4.1.5 |
| 17 | 顺序寻址增量 = 指令字长 ÷ 编址单位,不是 1 | 4.2.1 |
| 18 | 跳跃寻址复用数据寻址的那十种,不是独立算法 | 4.2.1 |
| 19 | 地址翻译六层,相邻两层不可比较也不可替代 | 4.2.1 |
| 20 | 立即寻址没有 EA;立即数是补码 | 4.2.2 |
| 21 | 间接寻址访存 2 次,寄存器间接 1 次 | 4.2.2 |
| 22 | 相对寻址的基准是已增量的 PC(下一条指令地址) | 4.2.2 |
| 23 | 基址:寄存器常、 | 4.2.2 |
| 24 | 变址寄存器存下标,数组首地址在形式地址里(易记反) | 4.2.2 |
| 25 | 段寄存器不是基址寄存器的实现,它在下一层 | 4.2.2 |
| 26 | 程序浮动有三种机制:静态重定位 / 基址寻址 / 相对寻址 | 4.2.2 |
| 27 | 前变址与后变址不等价 | 4.2.2 |
| 28 | LEA 从不访存,方括号在这里不表示取内容 | 4.3.1 |
| 29 | Intel 第一操作数是目的,AT&T 是源;机器码相同 | 4.3.1 |
| 30 | shl=sal 是一条指令,shr 与 sar 必须分家 | 4.3.1 |
| 31 | CF 管无符号溢出、OF 管有符号溢出,硬件两个都算 | 4.3.1 |
| 32 | 编译器把条件取反——看到 jle,源码多半写的是 > | 4.3.2 |
| 33 | g/l 有符号、a/b 无符号 | 4.3.2 |
| 34 | 跳转表越界检查必须用无符号 ja(一次挡两侧) | 4.3.2 |
| 35 | cmov 的两个分支都会被求值,有副作用时不可用 | 4.3.2 |
| 36 | 循环回跳给时间局部性,顺序访问给空间局部性(易接反) | 4.3.3 |
| 37 | for 与 while 的唯一实质差别是 continue 的落点 | 4.3.3 |
| 38 | 归纳变量替换:汇编里找不到 i 是正常的 | 4.3.3 |
| 39 | call 压的是下一条指令的地址 | 4.3.4 |
| 40 | ESP 变、EBP 不变;栈向低地址生长 | 4.3.4 |
| 41 | 参数区属于调用者的栈帧;叶子函数可能没有栈帧 | 4.3.4 |
| 42 | 调用约定属于 ABI;cdecl 调用者清栈才支持可变参数 | 4.3.4 |
| 43 | 微程序 / 硬布线都是典型搭配,不是定义 | 4.4.3 |
| 44 | RISC 精简的是每条指令的功能,不是指令条数 | 4.4.2 |
| 45 | CPI≈1 是吞吐口径,不是延迟口径 | 4.4.2 |
| 46 | 同一程序 RISC 的指令条数反而更多(多 20%~40%) | 4.4.3 |
| 47 | 只给一个因子问快慢 → “无法判断” | 4.4.3 |
| 48 | 现代 x86:ISA 仍是 CISC,微架构是 RISC 式 | 4.4.1 |
计算模板
本章的计算题种类不多但极固定,考前按这张表逐条过一遍。
| # | 题型 | 模板 | 在哪 |
|---|---|---|---|
| 1 | 取指访存次数 | 指令字长 ÷ 存储字长 | 4.1.2 |
| 2 | 总访存次数 | 取指 + 取操作数(查十种表)+ 存结果 | 4.2.2 |
| 3 | 定长操作码位数 | 4.1.3 | |
| 4 | 地址字段位数 | 4.1.3 | |
| 5 | 寄存器个数 / 直接寻址范围 | 4.1.3 | |
| 6 | 扩展操作码各层条数 | (上层总数 − 上层已用) | 4.1.4 |
| 7 | 扩展方案验算 | Kraft: | 4.1.4 |
| 8 | 变长编码期望长度 | 4.1.4 | |
| 9 | 顺序寻址 PC 增量 | 指令字长 ÷ 编址单位 | 4.2.1 |
| 10 | 相对转移目标地址 | 4.2.2 | |
| 11 | 相对寻址转移范围 | 4.2.2 | |
| 12 | 寻址方式种类数 | 寻址特征 | 4.2.1 |
| 13 | 栈帧偏移定位 | [ebp+8]=第一参数、[ebp+4]=返回地址、[ebp-4]=第一局部变量 | 4.3.4 |
| 14 | CPU 时间 | 4.4.3 |
复习顺序
- 4.1.1 先把 ISA / 微体系结构 / ABI 三层分清——本章一半的判断题出在这里
- 4.1.2 三个字长 + 访存次数模板,后面所有计算题的地基
- 4.1.3 定长操作码的容量公式,顺手记住”最多 / 至少”是两问
- 4.1.4 扩展操作码递推推熟;顺带把”长度从哪来”这条主线读完
- 4.1.5 按”访存吗 / 改标志位吗 / 改 PC 吗”三问过一遍指令类型
- 4.2.1 把地址翻译六层图记住——它是 4.2.2 全部困惑的解药
- 4.2.2 十种 EA 与访存次数默写;偏移三兄弟只记”哪一半是变量”
- 4.3.1 先认格式(
%$),再把LEA钉死 - 4.3.2 建立”条件是取反的”这个读汇编反射
- 4.3.3 认守卫、认归纳变量替换
- 4.3.4 栈帧图画一遍,偏移量背下来
- 4.4.1 → 4.4.2 → 4.4.3 最后用性能公式收口
大题优先级:4.3(读汇编反推 C)> 4.1.4(扩展操作码)> 4.2.2(EA 与访存次数)> 4.4.3(性能定量比较)。
说明
本章 14 页,一个三级节一页,节号以 王道 2026 教材目录为准。
归档复核发现一处节名错误:旧索引把 4.1 写成”指令格式”,教材的节名是”指令系统”;旧索引的 4.4 写成”CISC 和 RISC”,教材是”CISC和RISC的基本概念”。旧的四页概念页本身按主题命名、不带节号,因此没有节号错配。真正需要重排的是内容分布:4.1.5 指令的操作类型在旧页里只是一小节列表,现在独立成页并接上了第 5 章数据通路;4.3 的四个三级节旧页混在一篇里,现在按选择 / 循环 / 过程调用拆开。
本章 10 条原始提问全部归位,密度和分布见 原始提问档案(本地资料)。5 条挤在 4.2.2 且是同一个困惑的连续追问——这直接催生了本章第二条隐线。
链接
- 📖 名词库:第 4 章名词库(117 条 + 76 行高频范围限定清单)
- 📜 原始提问档案:第 4 章 原始提问档案(本地资料)(10 条)
- 📚 权威节号:王道 2026 教材目录
- ⬅️ 上一章:第 3 章 存储系统
- ➡️ 下一章:第 5 章 中央处理器
- 🗄️ 归档:旧版第 4 章笔记(本地资料)