← 上一章:第3章 | 📖 目录 | 下一章:第5章 →


第 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 章。



📝 章节小测

先动笔算完再看答案。寻址方式求 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 指令访问内存?

🎯 本章高频考点 & 易错坑

  • 计算/选择:各寻址方式求 EA;指令字长与地址范围;扩展操作码设计。
  • 简答:CISC vs RISC、指令格式组成、寻址方式分类。
  • ⚠️ 坑:间接寻址要两次访存最慢、寄存器寻址不访存最快;基址(面向系统)vs变址(面向用户/数组);RISC”只有Load/Store访存”。

← 上一章:第3章 | 📖 目录 | 下一章:第5章 →