第 4 章 指令系统 —— 教 CPU “把 a 取来、加上 b、存回去”的话怎么说
a+b 在这一章:CPU 不懂 C 语言,它只懂一条条”机器指令”。
a + b这一句,编译后大概是:LOAD a → R1(把a取进寄存器)、ADD R1, b(加上b)、STORE R1 → 和(存结果)。这一章讲的就是:一条指令长什么样、操作数怎么找(寻址)、CPU 一共会说哪些”词”。
4.1 指令系统的发展与要求
【知识点·什么是指令/指令系统】
- 🎓 指令是让计算机执行某种操作的命令;一台机器全部机器指令的集合称指令系统,它是软硬件的分界面,直接决定硬件结构与软件兼容性。
- 🌱 指令就是 CPU 能听懂的一句句”命令”,指令系统就是 CPU 的”全部词汇表”。这本词典定了,机器能干啥就定了。
【知识点·指令的三个层次】
- 🎓 微指令(硬件级,微程序的命令)< 机器指令(通常简称指令)< 宏指令(若干机器指令组成的软件指令)。
- 🌱 微指令是”抬左脚”这种最小动作,机器指令是”走一步”,宏指令是”走到门口”这种打包动作。
【知识点·指令系统性能要求】
- 🎓 完备性(够用)、有效性(程序占空间小、执行快)、规整性(对称性+匀齐性+一致性)、兼容性(保护软件遗产)。
- 🌱 词典要:词够用、说话省、规则统一、还要能听懂老版本的话。
4.2 指令格式(计算题考点)
【知识点·指令的两部分】
┌──────────┬─────────────────────────┐
│ 操作码 OP │ 地址码 (操作数地址) │
└──────────┴─────────────────────────┘
"干什么" "对谁干 / 结果放哪"
- 🎓 指令 = 操作码字段 OP(Operation Code,操作码——告诉 CPU 做什么操作,如加、减、取、存)+ 地址码字段(指明操作数的位置)。
- 🌱 一条指令 = “动词”(加)+ “宾语”(加谁、加完放哪)。
【知识点·按地址个数分类】
- 🎓 三地址
OP A1,A2,A3:(A1)op(A2)→A3;二地址OP A1,A2:(A1)op(A2)→A1;一地址OP A1:(AC)op(A1)→AC(AC = Accumulator,累加器——早期CPU中专门存放运算中间结果的固定寄存器);零地址OP(停机、空操作)。指令后 PC+1 指向下一条。 - 🌱 三地址=两个加数+一个放结果的地方都写明;二地址=结果覆盖第一个加数;一地址=另一个加数默认在累加器;零地址=连操作数都不用(如”停机”)。
- 二地址按操作数位置:RR(寄存器-寄存器,最快)、RS(寄存器-存储器)、SS(存储器-存储器,最慢)。
【知识点·操作码:定长 vs 扩展(变长)】
- 🎓 定长操作码(如IBM370全8位)规整、译码简单,但信息冗余大;扩展操作码(变长)让常用指令操作码短、少用的长,节省空间但译码复杂。
- 🌱 定长=每个词都用固定字数(整齐但浪费);扩展=常用词用短码、生僻词用长码(省地方,像摩斯电码里 E 最短)。
【知识点·指令字长】
- 🎓 指令字长(指令的二进制位数)可为单字长、半字长、双字长;多字长指令寻址能力强但需多次访存、降速。机器字长=CPU一次能处理的位数。
- 🌱 指令越长,能写下的地址越大、功能越强,但取一条要跑好几趟内存,慢。
【知识点·指令格式实例(RISC vs CISC)】
- 🎓 MIPS(Microprocessor without Interlocked Pipeline Stages,一种经典 RISC(Reduced Instruction Set Computer,精简指令集计算机)处理器)定长32位:R型
op|rs|rt|rd|shamt|funct、I型op|rs|rt|立即数/地址;Pentium(CISC(Complex Instruction Set Computer,复杂指令集计算机))变长1~12字节。 - 🌱 RISC 的指令都一样长一样规整(好流水),CISC 的指令长短不一功能复杂。我们的 ADD/LOAD 在 RISC 里就是规整的32位。
4.3 操作数类型
【知识点·数据类型】
- 🎓 地址数据、数值数据(定点/浮点/十进制)、字符数据(ASCII(American Standard Code for Information Interchange,美国信息交换标准代码——电脑表示字母、数字的国际编码)串)、逻辑数据(按位)。
- 🌱 指令要处理的”料”分几种:地址、数字、文字、一串0/1的开关量。我们的 a、b 是数值型(定点整数)。
4.4 寻址方式(高频,必会算有效地址 EA)
寻址 = 怎么找到操作数(或下一条指令)的真实地址。 EA = Effective Address(有效地址)。
【知识点·指令寻址】
- 🎓 顺序寻址:PC(Program Counter,程序计数器——始终存着下一条要执行的指令的内存地址)自动 +1 取下一条;跳跃寻址:转移指令把目标地址送 PC。
- 🌱 默认一条接一条往下走(PC+1);遇到 if/循环就”跳”到别处(改PC)。
【知识点·数据寻址方式大全(必背,附 EA 公式)】
| 方式 | 有效地址 EA | 一句话 |
|---|---|---|
| 立即寻址 | 操作数就在指令里 | 数直接写在指令中(如 ADD R1,#5) |
| 直接寻址 | EA = A | 指令里直接给出数的地址 |
| 间接寻址 | EA = (A) | 指令给的是”存地址的地址”,要多访存一次 |
| 寄存器寻址 | EA = Ri | 数在寄存器里(最快,不访存) |
| 寄存器间接 | EA = (Ri) | 数的地址在寄存器里 |
| 相对寻址 | EA = (PC) + D | 相对当前指令偏移(转移、位置无关码) |
| 基址寻址 | EA = (基址R) + A | 基址由OS(Operating System,操作系统)给,面向系统、扩大寻址范围 |
| 变址寻址 | EA = (变址R) + A | 变址由用户改,面向数组/循环 |
| 隐含寻址 | 操作数在约定寄存器 | 如累加器AC隐含 |
| 段寻址 | EA = 段基址 + 偏移 | x86分段 |
- 🌱 大白话区分基址 vs 变址:基址寻址”基准会变(程序搬家时)、偏移固定”;变址寻址”基准固定、偏移会变(数组下标一个个走)“。遍历数组 A[0],A[1]… 用的就是变址。
间接寻址示意(为什么慢):
指令 ─给出─▶ A地址 ──内存[A]里存的是──▶ B地址 ──内存[B]──▶ 真正的操作数
(第一次访存) (第二次访存)
课本例:C 语句
A[30]=h+A[30],r3存数组A基址、r2存h,编译成:LDR r5,[r3,#120](变址/基址取A[30],30×4=120)→ADD r5,r2,r5→STR r5,[r3,#120]。 这正是”取数→运算→存数”三步,和我们的 a+b 同构!
4.5 典型指令 & CISC / RISC(高频简答)
【知识点·指令分类】
- 🎓 数据传送(MOV/PUSH/POP)、运算(算术/逻辑/移位)、程序控制(转移/调用/返回)、输入输出、字符串、特权指令等。
- 🌱 CPU 的词分几大类:搬数据的、做计算的、管走向的(跳转)、管输入输出的、管系统的。
【知识点·CISC vs RISC(必考对比)】
| CISC(复杂指令集) | RISC(精简指令集) | |
|---|---|---|
| 指令数 | 多(几百条) | 少(<100) |
| 指令长度 | 变长 | 定长(典型4B) |
| 寻址方式 | 多而复杂 | 少而简单 |
| 访存 | 多种指令可访存 | 只有 Load/Store 访存 |
| 控制器 | 多用微程序 | 多用硬连线 |
| 寄存器 | 较少 | 大量通用寄存器 |
| 执行 | 指令周期不等 | 大多1个周期、强调流水线 |
- 🎓 RISC 三要素:精简的指令集 + 大量通用寄存器 + 优化的指令流水线。
- 🌱 CISC 像”瑞士军刀”功能多但笨重;RISC 像”几把好用的简单工具”,单个简单但配合流水线跑得飞快。20%的常用指令占了80%的运行时间——RISC 就是只留精华。
🔑 记忆金句:“典型 RISC 通常采用流水线,但流水 CPU 不一定是 RISC”(奔腾是流水线的 CISC)。教材常按此口径出判断题,但严格说 RISC 是设计哲学,流水线是实现手段,二者并非绑定。
4.6 ARM(Advanced RISC Machine,一种广泛用于手机/嵌入式设备的精简指令集处理器)汇编语言(了解)
【知识点·汇编语言】
- 🎓 汇编语言用助记符(ADD/LDR/STR)符号化机器指令,一条汇编语句≈一条机器指令,需”汇编器”翻译成二进制才能执行。
- 🌱 汇编就是给那串0/1指令起了好记的英文小名,但本质还是机器指令;写完得用汇编器翻成0/1。我们 a+b 的
ADD r5,r2,r5就是汇编。
⭐ 本章在 a+b 故事里的位置
现在 a+b 已经变成了几条规整的机器指令(取a、加b、存和),每条指令都知道去哪儿找操作数(寻址)。万事俱备——CPU 该真正动起来,把这些指令一条一条取出来、翻译、执行了。 这就是全书最重的第 5 章。
🧪 费曼检验区(合上笔记,用自己的话说)
规则:合上笔记,试着说给完全不懂的人听。卡壳了就说明没真懂,回头重读。
📌 老师划重点
- 简答题考地址线相关图
- CISC/RISC对比是选择/简答常客
📊 教材核心考点
- 一条指令由哪两部分组成?操作码和地址码分别是干什么的?
- 10种寻址方式中,相对寻址、基址寻址、变址寻址的EA公式分别是什么?它们的”基准”有什么不同?
- CISC和RISC最本质的区别是什么?为什么RISC只允许LOAD/STORE访问存储器?
- 操作码扩展是怎么回事?为什么要用变长操作码?
📝 章节小测
先动笔算完再看答案。寻址方式求 EA 是选择题和计算题常客。
【题 1 · 计算 · 寻址方式】 设指令中地址码 A = 200,PC = 100(指向本条指令的下一条),R1 = 300,(200) = 500,(500) = 800。分别求以下寻址方式的有效地址 EA 和最终取到的操作数: (1) 直接寻址 (2) 间接寻址 (3) 寄存器间接寻址(寄存器为 R1) (4) 相对寻址
【题 2 · 判断】 “基址寻址和变址寻址的有效地址计算公式相同(EA = 基址/变址 + 偏移),所以它们没有本质区别。” 对还是错?
【题 3 · 简答】 CISC 和 RISC 各有什么特点?RISC 为什么只允许 Load/Store 指令访问内存?
参考答案(点击展开)
题 1:
- (1) 直接寻址:EA = A = 200,操作数 = (200) = 500
- (2) 间接寻址:EA = (A) = (200) = 500,操作数 = (500) = 800(多一次访存)
- (3) 寄存器间接:EA = (R1) = 300,操作数 = (300) = 需查 M[300](题中未给出)
- (4) 相对寻址:EA = (PC) + A = 100 + 200 = 300,操作数 = (300)
题 2:错。公式形式虽相同,但用途和”谁变”不同:
- 基址寻址:基址由 OS 管、运行时固定,偏移在指令中固定 → 面向系统,用于程序重定位(程序搬家时改基址)
- 变址寻址:偏移在指令中固定,变址值由用户/循环改变 → 面向用户,用于遍历数组(A[i] 中 i 递增)
题 3:
- CISC:指令多(几百条)、变长、寻址方式多、多种指令可访存、多用微程序控制器
- RISC:指令少(<100)、定长(32位)、寻址简单、只有 Load/Store 访存、多用硬连线、大量寄存器、强调流水线
- RISC 限制只有 Load/Store 访存的原因:统一指令执行时间。如果 ADD 也能直接操作内存地址,那它有时要访存(慢)有时不用(快),指令周期不等长,流水线就很难设计。把”访存”集中到 Load/Store 两条指令上,其他指令全在寄存器间操作(一拍完成),流水线每段时间均匀,效率最高。
🎯 本章高频考点 & 易错坑
- 计算/选择:各寻址方式求 EA;指令字长与地址范围;扩展操作码设计。
- 简答:CISC vs RISC、指令格式组成、寻址方式分类。
- ⚠️ 坑:间接寻址要两次访存最慢、寄存器寻址不访存最快;基址(面向系统)vs变址(面向用户/数组);RISC”只有Load/Store访存”。