指令系统 专题

软考 · 计算机组成原理 | 指令格式 → 地址码 → 寻址方式 → CISC/RISC → 指令流水线 → 真题实战 | 机考模拟第 1 题考点
目录(✎ = 含例题): ① 一条指令长什么样 · ② 按地址码个数分类 · ③ 寻址方式(重点)✎ · ④ CISC vs RISC(本题考点)✎ · └ 小白逐点精讲 · └ 历年真题 4 道 · ⑤ 指令流水线(概览·外链) · ⑥ 真题实战 ✎

① 一条指令长什么样 instruction format

一条机器指令 = 操作码(OP) + 地址码。一个是"干什么",一个是"对谁干"。

操作码 OP :干什么(加 / 减 / 传送 / 跳转 / 停机) 地址码 A :对谁干(操作数地址 / 结果地址 / 下条指令地址) 例: ADD R1, [1000H] → 把内存 1000H 的内容加进 R1 │ └────┬──────┘ └ 操作码 └ 地址码:R1(目标寄存器)、[1000H](源操作数在内存) (只有 ADD) 记忆:操作码 = 动作(这里只有 ADD);地址码 = 操作数的位置(R1、[1000H] 都算)。 同上:ADD R1, R2, R3 → 操作码 ADD;地址码 R1、R2、R3 三个(三地址指令)。
概念含义考点(具体)
操作码位数操作码字段占几位,决定指令种类上限n 位操作码 → 最多 2n 种操作(8 位 = 256 种)。真题常问"某机操作码 X 位,最多几种操作"
指令字长一条指令占的二进制位数定长:译码快、好流水线(RISC 用);变长:省编码空间、灵活(CISC 用)
定长操作码所有指令的操作码位数都相同译码电路简单、速度快;但编码固定、能表示的指令总数受限,且可能浪费编码
扩展操作码操作码位数不固定:短码给常用指令、长码给不常用指令字长固定时"既不浪费编码、又能多塞指令";代价是译码变复杂。考法=计算题(见下)
🔑 送分点:操作码 n 位 → 2n 条指令。8 位操作码 = 最多 256 条指令。

💡 扩展操作码到底怎么算(可能出计算题)

为什么要有扩展操作码?字长是固定的(比如 16 位),如果所有指令都用等长操作码,要么指令数不够、要么编码浪费。扩展操作码让"用满地址码的指令(如三地址)操作码短、少用地址码的指令(如二/一/零地址)操作码长",从而在同一字长下塞进更多指令。

速算三条(先看懂下面算例再回来看):
① k 地址指令的操作码位数 = 字长 L − k ×(每个地址码位数 a);
② 上一级总会留几个"没用满"的编码当扩展标志 → 下一级可用编码数 = 上一级剩余编码数 × 2a(a = 每个地址码的位数);
③ 记忆:少用一个地址码,就空出 a 个格子,能翻出 2a 种新编码。
【经典算例】(就是下方 ⑥ 题2 的母题)指令字长 16 位,每个地址码 4 位,采用扩展操作码。若三地址指令有 15 条,二地址指令最多几条?
点击看答案(小白版·一步步来)
先建画面:一条指令就是固定 16 个格子;地址码固定 4 位一格,剩下的格子全归操作码。

三地址: [OP 4位][地址1 4位][地址2 4位][地址3 4位] ← 16 格占满 二地址: [OP 8位 ][地址1 4位][地址2 4位] ← 少 1 个地址,多 4 格给 OP 一地址: [OP 12位 ][地址1 4位] 零地址: [OP 16位 ]
第①步 三地址的操作码只占最左 4 格 → 24 = 16 种编码(0000~1111)。
第②步 三地址只要 15 条 → 16 种用掉 15 种,剩 1 种(比如 1111)没用。
第③步(关键) 当 CPU 看到开头是 1111,就知道"这不是三地址,要往下多读 4 格";后面那 4 格有 24 = 16 种 → 于是二地址最多 16 条。

🔑 那个"×24"不是什么公式,就是:少用一个地址码 → 空出 4 格 → 这 4 格能翻出 24 = 16 种新编码。
💡 反过来想更清楚:若三地址把 16 种全用满,就没剩编码可"往下扩展",二地址就是 0 条。所以题目才故意只给 15 条。

通用算法(照这四步套):
① 当前级操作码位数 = 字长 − 地址码个数 × 每格位数;
② 当前级总编码数 = 2操作码位数;
③ 剩余编码 = 总编码数 − 本级已用条数;
④ 下一级编码数 = 剩余编码 × 2每格位数(因为少用一个地址码,正好空出"每格位数"个格子)。
🔎 为什么二地址"前 4 位永远固定是 1111"?其实不是固定,是"数"出来的。
二地址的前缀 = 三地址没用完的那几个前缀。本题 16 个前缀用掉 15 个,只剩 1 个(1111)→ 前 4 位就被锁成 1111。
若三地址只给 8 条(0000~0111),剩余前缀 = 1000~1111 共 8 个 → 二地址 = 8 × 16 = 128 条(前 4 位可以是这 8 个里任意一个)。

完整编码表(本题:16 位字长、地址码各 4 位、三地址 15 条):
操作码完整形态类型怎么辨别
00000000 A1 A2 A3三地址读最左 4 位:0000~1110 → 三地址(读完 4 位停)
…11101110 A1 A2 A3三地址(共 15 条)
1111(不作单独指令)扩展标志读到 1111 → 再往下读 4 位
1111 00001111 0000 A1 A2二地址共 8 位操作码,前 4 位锁死 1111,后 4 位自由
…1111 11111111 1111 A1 A2二地址(共 16 条)
铁律:0000_xxxx 这种 8 位码永远不是二地址——CPU 读到 0000 就判定成三地址了。所以二地址能用开头的,只有没被三地址占掉的那个前缀。
🧮 对比"固定操作码"(别混):固定 6 位操作码时,所有 6 位都是自由位、互不抢编码 → 26=64。扩展操作码时,长指令的前缀里混着短指令的编码,短指令占掉的就不能再用 → 只能用"没占满的那部分前缀 × 空闲位"。这就是"固定 2n、扩展 2空闲位"的区别根源。
📌 考情(据你库内真题):这一行(操作码位数 / 指令字长 / 扩展操作码)没有直接命中的真题,属于基础概念 + 偶发计算题;本模块真正的高频是 CISC/RISC(④) 和 寻址方式(③)。基础概念记住"操作码定动作、地址码定操作数位置、n 位→2n 种"即可,扩展操作码会上面的算法就够。

② 按"地址码个数"分类(三/二/一/零地址指令)

类型形式含义例子
三地址a = b op c两个操作数、一个结果,各占一地址ADD R1,R2,R3(R1 ← R2+R3)
二地址a = a op b结果覆盖其中一个操作数(最常见)ADD R1,R2(R1←R1+R2)
一地址ac = ac op x另一个操作数隐含在累加器 ACADD X(AC←AC+X)
零地址op无操作数,或操作数隐在堆栈顶NOP / RET / 栈运算
💡 地址码越多 → 指令越长、结构越复杂;RISC 偏爱少地址码 + 寄存器。一地址指令靠 AC,零地址指令常配堆栈(如堆栈式计算机)。
🔑 读指令的方向:逗号最左边 = 目的地(存结果),其余 = 操作数来源。 ADD R1,R2,R3 → R1←R2+R3(不破坏原数);ADD R1,R2 → R1←R1+R2(结果盖回 R1)。

③ 寻址方式(找操作数的方式 · 必考) addressing modes

核心就一句话:指令里的"形式地址",怎样变成操作数真正的地址(有效地址 EA)?——但立即寻址是例外:它地址码里装的就是数据本身,不经过"算 EA→访存"这条链,所以没有 EA 公式(伪记法 操作数 = A,访存 0 次)。

寻址方式有效地址 / 操作数位置特点 / 用途
立即寻址操作数就在指令里(无 EA;伪记法 操作数=A)最快(取指即得,访存 0 次) / 但操作数固定不能改
直接寻址EA = A形式地址就是有效地址 / 访存 1 次
间接寻址EA = (A)A 单元里装的是 EA / 访存 ≥2 次,灵活但慢(一次间接)
寄存器寻址操作数在寄存器里快(不访存) / 寄存器数量有限
寄存器间接EA = (R)寄存器里装的是 EA / 比内存间接快
变址寻址EA = (IX) + A变址寄存器内容 + 形式地址 / 适合数组、循环
相对寻址EA = (PC) + APC 内容 + 形式地址 / 适合转移指令、程序浮动
基址寻址EA = (BR) + A基址寄存器 + 形式地址 / 适合多道程序重定位
堆栈寻址EA = (SP)由栈指针给出 / 零地址指令常用
🔑 先统一读懂"括号 ( )":含义 = "取里面的内容"(把括号里的东西当地址,读出它存的值)。
· (A):括号里是内存单元号 → 读出该单元的内容 → 这次"绕一层"就叫间接寻址。
· (R):括号里是寄存器 → 读出寄存器的内容,属于寄存器间接。
· (IX)+A / (PC)+A / (BR)+A:括号只表示"取该寄存器内容",整个式子另有名字(变址 / 相对 / 基址),不要因为看到括号就答"间接"。
一句话:括号里是内存单元号(如 (A))才叫间接;几层括号 = 几次间接(((A)) 是二次间接)。
⚠️ 变址 vs 基址(最爱混):
· 变址寻址:变址寄存器内容可变(循环里自增),形式地址不变 → 面向数组下标。
· 基址寻址:基址寄存器内容不变(程序装入时定),形式地址变 → 面向程序重定位。
一句话:变址——寄存器变、地址定;基址——寄存器定、地址变。
💡 执行速度排序(取操作数):立即 > 寄存器 > 直接 > 间接。访存次数:立即 0 次、直接 1 次、一次间接 2 次。
【例题 · 变址/相对 求 EA】某机指令中的形式地址 A = 20H。① 若采用变址寻址,变址寄存器内容 = 1000H,则有效地址 EA = ? ② 若采用相对寻址,PC 当前值 = 2000H,则 EA = ?
点击看答案
① 变址:EA = (IX) + A = 1000H + 20H = 1020H
② 相对:EA = (PC) + A = 2000H + 20H = 2020H
🔑 两式长得像,区别只在"加的是谁":变址加变址寄存器、相对加 PC、基址加基址寄存器。
【例题 · 寻址方式辨速度】下列寻址方式中,获取操作数速度最快的是(  )
A. 直接寻址  B. 间接寻址  C. 立即寻址  D. 寄存器间接寻址
点击看答案
C。立即寻址的操作数直接写在指令里,取指时一并拿到,不需要再访存,所以最快。
❌ 直接寻址要访存 1 次取操作数;❌ 间接/寄存器间接还要多绕一层。
🔑 排序记牢:立即(0 次访存)> 寄存器(不访存)> 直接(1 次)> 间接(≥2 次)。

④ CISC vs RISC(机考模拟第 1 题就是它) complex / reduced instruction set

根源:早期一味堆指令(CISC),后来发现复杂指令很少用、还拖慢速度 → 反其道而行,只留简单高频指令 + 流水线 + 好编译器(RISC)。

🔰 小白逐点精讲:一句话看懂 CISC 和 RISC 在吵什么

1
先搞懂"指令系统"是啥 指令系统(指令集)= CPU 能听懂的全部命令清单。每条命令 = 操作码(干什么)+ 地址码(对谁干)。 👉 设计 CPU 时,这份清单是"又长又全"还是"又短又精",就分出了 CISC 和 RISC 两条路。
2
CISC:菜单厚得像词典(Complex,复杂) 早期思路是"命令越多越强大":一条指令能干很复杂的事(比如一条就把两内存数相加)。 优点:高级语言编译轻松,程序员省事;缺点:指令又长又杂、电路复杂、大部分复杂指令其实很少用。 典型:Intel x86(你 PC 的 CPU)。
3
RISC:菜单只留招牌菜(Reduced,精简) 现代思路:研究发现 20% 的指令占了 80% 的使用(帕累托)→ 干脆只留最常用、最简单的指令,复杂的事让"多条简单指令 + 编译器"拼出来。 优点:每条指令短、定长、执行快(大多 1 个时钟周期),天生适合流水线;缺点:编译器要更聪明。 典型:ARM(你的手机芯片)、MIPS、RISC-V。
4
最容易错的点:谁是"寄存器多"? RISC 寄存器多!因为它规定"运算只能在寄存器之间做",只有 load/store 两条指令能碰内存。所以必须配一大堆通用寄存器来暂存数据。 👉 CISC 反而寄存器少——它允许指令直接操作内存,不用那么多寄存器中转。
5
最最常考的点:控制器谁是"微程序"、谁是"硬布线" CISC → 微程序控制(靠一段段"小程序"解释执行复杂指令,灵活但慢);RISC → 硬布线(组合逻辑)控制(直接用电路实现,快)。 你问的这道题 B 就错在这——它说反了。
6
访存:谁能"随手访问内存"? CISC:任何指令都能直接访问内存;RISC:只有 load/store 访存,其余运算都在寄存器间做。 👉 这也是为什么 RISC 要那么多寄存器。
7
流水线:两个都能用,但 RISC 更顺 流水线 = 像工厂装配线一样让多条指令重叠执行。RISC 指令定长规整,流水起来顺;CISC 指令长短不一,容易卡。 👉 所以"只有 RISC 用流水线"是错的——两者都能用流水线,这是经典干扰项。
🔑 一句话记牢(考场上就靠这句):
RISC = 少(指令少)、定(定长)、简(寻址方式少)、多(寄存器多)、硬(硬布线控制)、流(善流水线)、只有 load/store 访存;
CISC = 多(指令多)、变(变长)、杂(寻址多)、微(微程序控制)、少寄存器、任意指令可访存、难流水线。

📚 历年真题(CISC / RISC 高频 4 道)

【2022 上半年 · 第 4 题】(就是你问的这道)
以下关于 RISC 和 CISC 的叙述中,不正确的是( )。
A. RISC 的大多指令在一个时钟周期内完成
B. RISC 普遍采用微程序控制器,CISC 则普遍采用硬布线控制器
C. RISC 的指令种类和寻址方式相对于 CISC 更少
D. RISC 和 CISC 都采用流水线技术
✅ 答案:B。RISC 用硬布线控制、CISC 用微程序控制,B 把两者说反了。
✅ A:RISC 指令精简定长,大多 1 个时钟周期完成;
✅ C:RISC 指令种类少、寻址方式少;
✅ D:两者都能流水线(RISC 更适合)——这不算错。
【2022 下半年 · 第 1 题】
以下关于 RISC(精简指令集计算机)特点的叙述中,错误的是( )。
A. 对存储器操作进行限制,使控制简单化
B. 指令种类多,指令功能强
C. 设置大量通用寄存器
D. 选取使用频率较高的一些指令,提高执行速度
✅ 答案:B。"指令种类多、功能强"是 CISC 的特点,RISC 恰恰相反(少、简单)。
✅ A:RISC 只有 load/store 访存 → 控制简单;✅ C:运算在寄存器间 → 大量通用寄存器;✅ D:只保留高频指令提速。
【2021 上半年 · 第 2 题(正向问)】
以下关于 RISC 和 CISC 计算机的叙述中,正确的是( )。
A. RISC 不采用流水线技术,CISC 采用流水线技术
B. RISC 使用复杂的指令,CISC 使用简单的指令
C. RISC 采用很少的通用寄存器,CISC 采用很多的通用寄存器
D. RISC 采用组合逻辑控制器,CISC 普遍采用微程序控制器
✅ 答案:D。组合逻辑(=硬布线)控制器属 RISC,微程序控制器属 CISC,D 正确。
❌ A:两者都可用流水线;❌ B:说反了(RISC 简单、CISC 复杂); ❌ C:说反了(RISC 寄存器多、CISC 少)。
【2021 下半年 · 第 1 题(寻址方式 · 顺带考)】
计算机指令系统采用多种寻址方式。立即寻址是指操作数包含在指令中;寄存器寻址是指操作数在寄存器中;直接寻址是指操作数的地址在指令中。这三种寻址方式操作数的速度( )。
A. 立即寻址最快;寄存器寻址次之,直接寻址最慢
B. 寄存器寻址最快,立即寻址次之,直接寻址最慢
C. 直接寻址最快,寄存器寻址次之,立即寻址最慢
D. 寄存器寻址最快,直接寻址次之,立即寻址最慢
✅ 答案:A。速度:立即 > 寄存器 > 直接。
立即寻址操作数就在指令里,取指时一并拿到,最快;寄存器寻址读寄存器,次之;直接寻址要访存取操作数,最慢。
🔑 记:立即(0 次访存) > 寄存器(不访存) > 直接(1 次访存) > 间接(≥2 次)。

CISC 复杂指令集

RISC 精简指令集

对比项CISCRISC
指令数量 / 复杂度多、功能强少、简单
指令长度可变、格式多样定长、格式少
寻址方式多、复杂少、简单
访存限制任意指令可访存只有 load/store 访存
控制器微程序控制硬布线控制
通用寄存器数相对少大量
执行周期长短不一、难流水线化大多一个周期、适合流水线
编译优化难生成高效代码易被编译器优化
典型代表Intel x86、VAXARM、MIPS、RISC-V
⚠️ 三个最爱考的坑:
1. "指令种类多、功能强" = CISC,别扣给 RISC(机考第 1 题 B 就错在这)。
2. "大量通用寄存器" = RISC(运算在寄存器间进行,所以寄存器多)。
3. 控制器:CISC 用微程序、RISC 用硬布线——这对立常单独出单选。
🔑 一句话口诀:
RISC = 少(指令少)、定(定长)、简(寻址少)、多(寄存器多)、硬(硬布线)、流(善流水线);
CISC = 多、变、杂、微(微程序)、少寄存器。
【真题原文 · 机考模拟第 1 题】以下关于 RISC(精简指令集计算机)特点的叙述中,错误的是(  )
A. 对存储器操作进行限制,使控制简单化  B. 指令种类多,指令功能强
C. 设置大量通用寄存器  D. 选取使用频率较高的一些指令,提高执行速度
点击看答案
B("指令种类多、功能强"是 CISC 的特点)。
✅ A:RISC 只有 load/store 访问存储器,访存受限 → 控制简单
❌ B:RISC 是"指令种类少、功能简单",说"多、强"是 CISC
✅ C:RISC 运算在寄存器间进行 → 需要大量通用寄存器
✅ D:RISC 只保留高频指令(砍掉低频复杂指令),提高执行速度
🔑 诀窍:看到"指令多、功能强"就往 CISC 想,那正是 RISC 的反面。
【真题风格 · 反向问 CISC】以下关于 CISC(复杂指令集计算机)的叙述中,错误的是(  )
A. 指令数量多,使用频率相差悬殊  B. 指令长度可变,寻址方式多
C. 控制器以硬布线控制为主  D. 各种指令都可访问存储器
点击看答案
C。硬布线(组合逻辑)是 RISC 的,CISC 用微程序控制。
✅ A:CISC 指令多,且"20% 指令占 80% 使用率"(帕累托)
✅ B:CISC 指令变长、寻址多(RISC 才定长、寻址少)
✅ D:CISC 任意指令都能访存(RISC 只有 load/store)
🔑 控制器归属是高频考点:CISC→微程序,RISC→硬布线。

⑤ 指令流水线(概览 · 详细见动画) instruction pipeline

流水线是把"取指→译码→执行→写回"这几步像装配线一样重叠起来,让多条指令同时处于不同阶段,从而提速。RISC 指令规整,天生适合流水线。

核心公式: 执行 n 条指令、k 段流水线 → 总时间 = (k + n − 1) × Δt 吞吐率 TP = n / 总时间 建立时间 = k × Δt 加速比 S = 串行时间 / 流水线时间 效率 E = 时空图有效面积 / 总面积
🔑 详细动画与"加速比 / 效率 / 超标量 / 三类相关 / 流水线真题"请看: 🎞 流水线动画(时空图 + 执行时间 + 吞吐率) —— 本篇不重复。

⑥ 真题实战(先选,再点开) practice

题1(操作码位数):某计算机指令的操作码固定为 6 位,则该计算机最多可有(  )种操作。
A. 6  B. 36  C. 64  D. 128
点击看答案
C。n 位操作码 → 2n 种 = 26 = 64 种。
🔑 记住"几位操作码就是 2 的几次方",别拿位数直接当选。
题2(扩展操作码 · 经典):某机指令字长 16 位,每个地址码 4 位,采用扩展操作码。若三地址指令有 15 条,则二地址指令最多有(  )条。
A. 14  B. 15  C. 16  D. 32
点击看答案
C(16 条)。三步走:
① 三地址指令占 3×4 = 12 位地址码,剩 4 位给操作码 → 共 24 = 16 种编码
② 三地址用掉 15 种,剩 1 种留作扩展
③ 二地址少一个地址码,多出的 4 位并进操作码 → 那 1 种 × 24 = 16 条二地址指令
🔑 算法一句话:上一级没用满的那几种编码 × 2每个地址码位数(少一个地址码就空出 4 格,能翻 16 种)。短码给常用指令,长码给更多指令。
题3(寻址方式):指令中的形式地址为 A,操作数存放在由 A 指示的内存单元所指向的单元中,这种寻址方式是(  )
A. 立即寻址  B. 直接寻址  C. 间接寻址  D. 寄存器寻址
点击看答案
C. 间接寻址。EA = (A)——A 单元里装的是"操作数的地址",要再访存一次才拿到操作数。
❌ A 立即:操作数就在指令里;❌ B 直接:EA=A,A 就是操作数地址(不绕第二层);❌ D 寄存器:操作数在寄存器里。
🔑 "指向……的单元"= 多绕一层 = 间接。
题4(CISC/RISC 综合):下列叙述中,不属于 RISC 特点的是(  )
A. 指令长度固定,格式少,寻址方式少
B. 只有 load/store 指令访问存储器
C. 控制器采用微程序控制,指令功能强
D. 设置大量通用寄存器,采用流水线技术
点击看答案
C。RISC 用硬布线控制、指令功能简单;"微程序控制 + 功能强"是 CISC。
✅ A、B、D 全是 RISC 的正解特点。
🔑 这题几乎把 CISC/RISC 对立点考全了,会这题,同类全通。
题5(一地址/零地址):下列指令中,通常属于零地址指令的是(  )
A. ADD R1, R2  B. PUSH  C. MOV R1, #5  D. JMP 2000H
点击看答案
B. PUSH。零地址指令无显式操作数,操作数隐含在堆栈(由 SP 给出),PUSH/POP 是典型。
❌ A 二地址、❌ C 含立即数、❌ D 含转移地址,都不是零地址。
🔑 零地址 = 操作数隐在堆栈,靠 SP 定位。
考点典型题干例题位置
CISC vs RISC"以下关于 RISC 特点错误的是"④ 两道(真题原文 + 反向)
操作码/指令数n 位操作码 → 多少种操作⑥ 题1
扩展操作码字长/地址码位数 → 二地址最多几条⑥ 题2
寻址方式判定"操作数在……所指单元中"③ 两道 · ⑥ 题3
有效地址计算变址/相对/基址 求 EA③ 例题
地址码个数分类三/二/一/零地址识别② · ⑥ 题5
🔑 结论:指令系统这块上午必考 1~2 分。核心就三样——操作码位数算指令数、寻址方式辨 EA、CISC/RISC 对立点。全吃透即可。
本专题总收:
① 指令 = 操作码 + 地址码;n 位操作码 → 2n 条指令;
② 按地址码个数分:三 / 二 / 一(隐含 AC)/ 零(隐含堆栈);
③ 寻址方式:立即(0次访存)、直接(EA=A)、间接(EA=(A))、寄存器、变址(EA=(IX)+A,数组)、相对(EA=(PC)+A,转移)、基址(EA=(BR)+A,重定位);速度快慢:立即>寄存器>直接>间接;
④ CISC:多、变、杂、微程序、少寄存器;RISC:少、定、简、多寄存器、硬布线、只有 load/store 访存、善流水线;
⑤ 流水线:总时间 =(k+n−1)×Δt,详见流水线动画。