Appearance
指令格式与操作类型
考情分析
指令格式和操作码扩展是 408 指令系统的基础,常以选择题或大题第一小问出现。零地址指令的使用场景和三地址指令的操作流程要能准确描述。
大纲定位
考纲第四章(一)(二):指令系统的基本概念、指令格式。
要求到什么程度:能按题面给的字段表画出位段划分并算各字段位宽,能由字段位宽反推可编码对象数(指令条数、寄存器个数、寻址范围),并把主存的编址单位、MAR/MDR 位数串起来。
指令系统体系结构(ISA)
ISA(Instruction Set Architecture,指令集体系结构)是硬件和软件之间的约定界面:它规定了程序员(或编译器)能看见、能用的一切,而把"怎么实现"留给硬件设计者。
判据只有一条:软件可见的属于 ISA,实现细节属于微架构。
| ISA 规定(软件可见) | 微架构决定(实现细节) |
|---|---|
| 指令格式与指令集 | 主频、时钟周期 |
| 寄存器的个数与位数 | 流水线级数、是否超标量 |
| 寻址方式 | Cache 大小与层次 |
| 数据类型与字长 | 控制器用微程序还是硬布线 |
| 中断/异常模型 | 内部总线结构、加法器的进位方式 |
| 存储器模型(编址方式、字节序) | 数据通路是单总线还是多总线 |
编者注(判题):问"下列哪个属于 ISA",就问自己——换一款实现同一 ISA 的 CPU,这个东西会变吗?寄存器个数不会变(否则程序跑不了),流水线级数会变。会变的就是微架构。
指令的基本结构
一条指令由两部分组成:
- 操作码:指定操作类型(加法、移位、跳转等),位数决定可以表示的指令条数
- 地址码:指定操作数的来源和结果的去处
地址码不只是"形式地址"
地址码常常还要再切一刀,分成寻址方式位和形式地址:
- M(寻址方式位):告诉 CPU 该怎么解释 D——是立即数、直接地址,还是某个寄存器编号
- D(形式地址):指令里写着的那个数
编者注(易错):算"形式地址能寻多大范围"时,不能拿指令字长直接减操作码位数。16 位指令、6 位操作码,若还有 2 位寻址方式,形式地址只有
位而不是 10 位。先看题目给了几个字段,再做减法。
字段位宽 ↔ 可编码对象数
指令格式题的通用换算只有一条:
| 字段 | |
|---|---|
| 操作码 | |
| 寄存器编号 | |
| 形式地址(无符号) | 寻址范围 |
| 移位量 shamt | 移位 |
反过来,已知对象个数求字段位宽要向上取整:位宽
形式地址按无符号还是补码读,看寻址方式:
| 寻址方式 | 口径 | 范围 |
|---|---|---|
| 直接 / 间接(是个绝对地址) | 无符号 | |
| 相对 / 基址 / 变址(是个偏移量) | 补码 |
偏移量参与运算前还要符号扩展到地址位宽——零扩展只用于无符号量,用错会把负偏移变成一个大正数。
按地址码个数分类
三地址指令
含义:
例:ADD R1, R2, R3(R1 + R2 → R3)
- 三个操作数地址均显式指定
- 指令长,但不破坏源操作数
二地址指令
含义:
例:ADD R1, R2(R1 + R2 → R1)
- 最常用的格式,x86 等 CISC 架构广泛使用
- 会破坏源操作数
一地址指令
含义:
例:ADD X(ACC + X → ACC)
- 隐式操作数是累加器,无需在指令中指定
- 早期累加器架构(如 8080)广泛使用
零地址指令
两种情况:
- 无需操作数:
NOP(空操作)、HLT(停机) - 操作数隐含在栈顶:堆栈型机器中,操作数从栈顶自动弹出,结果压回栈顶
例:后缀表达式计算机,ADD 弹出栈顶两个数相加后压回。
按操作类型分类
| 类别 | 典型指令 | 说明 |
|---|---|---|
| 数据传送 | MOV, LOAD, STORE | 寄存器与存储器之间的数据移动 |
| 算术运算 | ADD, SUB, MUL, DIV | 整数/浮点运算 |
| 逻辑运算 | AND, OR, NOT, XOR | 按位逻辑操作 |
| 移位操作 | SHL, SHR, ROL, ROR | 算术/逻辑/循环移位 |
| 转移指令 | JMP, JZ, JNZ, CALL, RET | 改变程序流 |
| 输入输出 | IN, OUT | I/O 操作 |
| 特权指令 | 中断、停机等 | 只能在核心态执行 |
指令格式设计
定长操作码
所有指令的操作码位数相同。
- 简单,便于硬件译码(直接查表)
- 灵活性差,不同类型指令地址码位数一致
变长操作码(扩展操作码)
不同指令的操作码位数不同,短操作码对应地址多的指令,长操作码对应地址少的指令。
详见「指令设计(操作码扩展)」篇。
真题给的是位段图,不是汇编写法
上面各节用的

图 4.5 MIPS 指令格式(R 型)
照着这张图能直接读出:OP 占 rs/rt/rd 各占 5 位(shamt 5 位(移位量 func 6 位。答题时也要按这个形式写——标出每段的位区间,不是只写位数。
汇编 → 机器码:正向编码
解码方向(机器码 → 字段)是下面的可视化在做的事;真题还常考反方向——给字段值,拼出十六进制机器码。步骤固定:
- 按题给的字段表,从高位到低位逐段填二进制
- 未使用的字段一律补 0(短格式指令在长格式位置上的多余字段)
- 4 位一组转十六进制
编者注(易错):第 2 步最常被漏。二地址指令在三地址格式的位宽里,末尾那几位地址字段要填 0,不能空着不写。
交互可视化
指令字长
- 单字长指令:一条指令占一个机器字
- 半字长指令:操作简单,压缩码空间
- 双字长指令:操作数需要更多位(如包含立即数或长地址)
注意区分:
- 机器字长:CPU 一次能处理的数据位数(ALU 位宽、通用寄存器宽度)
- 指令字长:一条指令的二进制长度
- 存储字长:存储器每个单元的位数——由编址单位决定
三者可以相同,也可以不同。
一切从"编址单位"开始
这是本章最容易被跳过、却最常决定对错的一步。编址单位 = 一个地址对应多少位:
| 编址方式 | 存储单元宽度 | 一条 32 位指令占几个单元 |
|---|---|---|
| 按字节编址 | 8 位 | 4 个 |
| 按字编址(设字长 16 位) | = 字长 16 位 | 2 个 |
由它出发的三步链:
例:主存 128 KB,按字编址,字长 16 位。
编者注(易错):这道题按字节算会得
→ MAR 17 位,错。题目说"按字编址"就必须除以字长字节数。看到"按 X 编址"四个字,先把它圈出来。
指令字长必须是编址单位的整数倍
按字节编址时,一条指令占的是整数个字节——算出来不是 8 的倍数就要向上圆整。
例:某指令需要 23 位。按字节编址 → 圆整到 24 位(3 字节),不能是 23 位。
这一步经常是选择题 A、B 两项的分野。同理,32 位定长指令按字节编址占 4 个单元,所以顺序执行时 PC
考点清单
- 三地址:OP A1, A2, A3(A1 OP A2 → A3)
- 二地址:OP A1, A2(A1 OP A2 → A1,破坏A1)
- 一地址:隐含累加器 ACC
- 零地址:NOP/HLT,或堆栈操作
- 操作码位数
→ 最多表示 条指令;推广:任一 位字段 → 个可编码对象 - 反向求位宽要向上取整:位宽
- 地址码可能还含寻址方式位,别拿指令字长直接减操作码
- 形式地址:直接/间接按无符号,相对/基址/变址按补码且要符号扩展
- 编址单位决定存储字长与 MAR 位数:按字编址时单元总数
容量 字长字节数 - 指令字长必须是编址单位的整数倍,23 位按字节编址要圆整到 24 位
- ISA = 软件可见的部分(指令格式、寄存器个数、寻址方式、中断模型);主频、流水线级数、Cache 属微架构
- 卷面按位段图答题,标出各字段的位区间;编码时未用字段补 0
解题动作清单
指令格式题的第一小问几乎都是"字段位宽 ↔ 规模"的互推,三步走:
- 照题面把位段表画出来,标出每段的名字和位宽(
这种形式) - 逐字段做
换算:操作码 → 指令条数;寄存器号 → 寄存器个数;形式地址 → 寻址范围(先判无符号还是补码) - 凡涉及主存,先确认编址单位,再算单元总数 → MAR 位数;MDR 位数 = 存储字长
收尾检查两条:指令字长是不是编址单位的整数倍;未用字段有没有补 0。
教材出处
- 袁春风《计算机组成与系统结构(第 3 版)》§4.2 指令格式:图 4.5(p104)