指令系统 专题
软考 · 计算机组成原理 | 指令格式 → 地址码 → 寻址方式 → CISC/RISC → 指令流水线 → 真题实战 | 机考模拟第 1 题考点
① 一条指令长什么样 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 格 → 2
4 =
16 种 编码(0000~1111)。
第②步 三地址只要
15 条 → 16 种用掉 15 种,
剩 1 种 (比如 1111)没用。
第③步(关键) 当 CPU 看到开头是
1111 ,就知道"这不是三地址,要往下多读 4 格";后面那 4 格有 2
4 = 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 条):
操作码 完整形态 类型 怎么辨别
0000 0000 A1 A2 A3 三地址 读最左 4 位:0000~1110 → 三地址(读完 4 位停)
…1110 1110 A1 A2 A3 三地址(共 15 条)
1111 (不作单独指令) 扩展标志 读到 1111 → 再往下读 4 位
1111 0000 1111 0000 A1 A2 二地址 共 8 位操作码,前 4 位锁死 1111,后 4 位自由
…1111 1111 1111 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另一个操作数隐含在累加器 AC ADD 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 复杂指令集
指令数量多 (100~250 条)
指令功能强、复杂
指令长度可变 、格式多样
寻址方式多
任意指令都能访存
控制器以微程序控制 为主
通用寄存器相对少
代表:Intel x86、VAX
RISC 精简指令集
指令数量少 (< 100 条)
指令功能简单、规整
指令长度固定 、格式少
寻址方式少
只有 load/store 访存
控制器以硬布线(组合逻辑) 为主
通用寄存器大量
代表:ARM、MIPS、RISC-V
对比项 CISC RISC
指令数量 / 复杂度 多、功能强 少、简单
指令长度 可变、格式多样 定长、格式少
寻址方式 多、复杂 少、简单
访存限制 任意指令可访存 只有 load/store 访存
控制器 微程序控制 硬布线控制
通用寄存器数 相对少 大量
执行周期 长短不一、难流水线化 大多一个周期、适合流水线
编译优化 难生成高效代码 易被编译器优化
典型代表 Intel x86、VAX ARM、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,详见流水线动画。
↑