精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

指令格式与操作类型

考情分析

指令格式和操作码扩展是 408 指令系统的基础,常以选择题或大题第一小问出现。零地址指令的使用场景和三地址指令的操作流程要能准确描述。

大纲定位

考纲第四章(一)(二):指令系统的基本概念指令格式

要求到什么程度:能按题面给的字段表画出位段划分并算各字段位宽,能由字段位宽反推可编码对象数(指令条数、寄存器个数、寻址范围),并把主存的编址单位、MAR/MDR 位数串起来。

指令系统体系结构(ISA)

ISA(Instruction Set Architecture,指令集体系结构)是硬件和软件之间的约定界面:它规定了程序员(或编译器)能看见、能用的一切,而把"怎么实现"留给硬件设计者。

判据只有一条:软件可见的属于 ISA,实现细节属于微架构。

ISA 规定(软件可见)微架构决定(实现细节)
指令格式与指令集主频、时钟周期
寄存器的个数与位数流水线级数、是否超标量
寻址方式Cache 大小与层次
数据类型与字长控制器用微程序还是硬布线
中断/异常模型内部总线结构、加法器的进位方式
存储器模型(编址方式、字节序)数据通路是单总线还是多总线

编者注(判题):问"下列哪个属于 ISA",就问自己——换一款实现同一 ISA 的 CPU,这个东西会变吗?寄存器个数不会变(否则程序跑不了),流水线级数会变。会变的就是微架构。

指令的基本结构

一条指令由两部分组成:

操作码(OP)+地址码
  • 操作码:指定操作类型(加法、移位、跳转等),位数决定可以表示的指令条数
  • 地址码:指定操作数的来源和结果的去处

地址码不只是"形式地址"

地址码常常还要再切一刀,分成寻址方式位和形式地址:

[ OP  M  D ]
  • M(寻址方式位):告诉 CPU 该怎么解释 D——是立即数、直接地址,还是某个寄存器编号
  • D(形式地址):指令里写着的那个数

编者注(易错):算"形式地址能寻多大范围"时,不能拿指令字长直接减操作码位数。16 位指令、6 位操作码,若还有 2 位寻址方式,形式地址只有 1662=8 位而不是 10 位。先看题目给了几个字段,再做减法。

字段位宽 ↔ 可编码对象数

指令格式题的通用换算只有一条:k 位字段能编码 2k 个对象。对象是什么由字段决定:

字段k 位能表示
操作码2k 条指令
寄存器编号2k 个通用寄存器
形式地址(无符号)寻址范围 02k1
移位量 shamt移位 02k1

反过来,已知对象个数求字段位宽向上取整:位宽 =log2(对象个数)

形式地址按无符号还是补码读,看寻址方式:

寻址方式口径范围
直接 / 间接(是个绝对地址)无符号02n1
相对 / 基址 / 变址(是个偏移量)补码2n12n11

偏移量参与运算前还要符号扩展到地址位宽——零扩展只用于无符号量,用错会把负偏移变成一个大正数。

按地址码个数分类

三地址指令

OP  A1, A2, A3

含义:(A1) OP (A2)A3

例:ADD R1, R2, R3(R1 + R2 → R3)

  • 三个操作数地址均显式指定
  • 指令长,但不破坏源操作数

二地址指令

OP  A1, A2

含义:(A1) OP (A2)A1(结果存回第一个操作数)

例:ADD R1, R2(R1 + R2 → R1)

  • 最常用的格式,x86 等 CISC 架构广泛使用
  • 会破坏源操作数 A1

一地址指令

OP  A1

含义:(ACC) OP (A1)ACC(隐含使用累加器 ACC)

例:ADD X(ACC + X → ACC)

  • 隐式操作数是累加器,无需在指令中指定
  • 早期累加器架构(如 8080)广泛使用

零地址指令

OP

两种情况:

  1. 无需操作数NOP(空操作)、HLT(停机)
  2. 操作数隐含在栈顶:堆栈型机器中,操作数从栈顶自动弹出,结果压回栈顶

例:后缀表达式计算机,ADD 弹出栈顶两个数相加后压回。

按操作类型分类

类别典型指令说明
数据传送MOV, LOAD, STORE寄存器与存储器之间的数据移动
算术运算ADD, SUB, MUL, DIV整数/浮点运算
逻辑运算AND, OR, NOT, XOR按位逻辑操作
移位操作SHL, SHR, ROL, ROR算术/逻辑/循环移位
转移指令JMP, JZ, JNZ, CALL, RET改变程序流
输入输出IN, OUTI/O 操作
特权指令中断、停机等只能在核心态执行

指令格式设计

定长操作码

所有指令的操作码位数相同。

  • 简单,便于硬件译码(直接查表)
  • 灵活性差,不同类型指令地址码位数一致

变长操作码(扩展操作码)

不同指令的操作码位数不同,短操作码对应地址多的指令,长操作码对应地址少的指令。

详见「指令设计(操作码扩展)」篇。

真题给的是位段图,不是汇编写法

上面各节用的 OP A1,A2,A3汇编书写形式。真题给的一律是位段划分——每个字段占哪几位标得清清楚楚:

图 4.5 MIPS 指令格式

图 4.5 MIPS 指令格式(R 型)

照着这张图能直接读出:OP[31:26] 共 6 位、rs/rt/rd 各占 5 位(25=32 个通用寄存器)、shamt 5 位(移位量 031)、func 6 位。答题时也要按这个形式写——标出每段的位区间,不是只写位数。

汇编 → 机器码:正向编码

解码方向(机器码 → 字段)是下面的可视化在做的事;真题还常考反方向——给字段值,拼出十六进制机器码。步骤固定:

  1. 按题给的字段表,从高位到低位逐段填二进制
  2. 未使用的字段一律补 0(短格式指令在长格式位置上的多余字段)
  3. 4 位一组转十六进制

编者注(易错):第 2 步最常被漏。二地址指令在三地址格式的位宽里,末尾那几位地址字段要填 0,不能空着不写。

交互可视化

加载可视化中...

指令字长

  • 单字长指令:一条指令占一个机器字
  • 半字长指令:操作简单,压缩码空间
  • 双字长指令:操作数需要更多位(如包含立即数或长地址)

注意区分:

  • 机器字长:CPU 一次能处理的数据位数(ALU 位宽、通用寄存器宽度)
  • 指令字长:一条指令的二进制长度
  • 存储字长:存储器每个单元的位数——由编址单位决定

三者可以相同,也可以不同。

一切从"编址单位"开始

这是本章最容易被跳过、却最常决定对错的一步。编址单位 = 一个地址对应多少位

编址方式存储单元宽度一条 32 位指令占几个单元
字节编址8 位4 个
编址(设字长 16 位)= 字长 16 位2 个

由它出发的三步链:

单元总数=主存容量编址单位MAR 位数log2(单元总数)MDR 位数=一次读写的宽度=存储字长

:主存 128 KB,按字编址,字长 16 位。

单元总数=128KB2B=64K=216MAR16 ,MDR=16 

编者注(易错):这道题按字节算会得 128K=217 → MAR 17 位,。题目说"按字编址"就必须除以字长字节数。看到"按 X 编址"四个字,先把它圈出来。

指令字长必须是编址单位的整数倍

按字节编址时,一条指令占的是整数个字节——算出来不是 8 的倍数就要向上圆整

:某指令需要 23 位。按字节编址 → 圆整到 24 位(3 字节),不能是 23 位。

这一步经常是选择题 A、B 两项的分野。同理,32 位定长指令按字节编址占 4 个单元,所以顺序执行时 PC +4

考点清单

  • 三地址:OP A1, A2, A3(A1 OP A2 → A3)
  • 二地址:OP A1, A2(A1 OP A2 → A1,破坏A1)
  • 一地址:隐含累加器 ACC
  • 零地址:NOP/HLT,或堆栈操作
  • 操作码位数 n → 最多表示 2n 条指令;推广:任一 k 位字段 → 2k 个可编码对象
  • 反向求位宽要向上取整:位宽 =log2(对象个数)
  • 地址码可能还含寻址方式位,别拿指令字长直接减操作码
  • 形式地址:直接/间接按无符号,相对/基址/变址按补码且要符号扩展
  • 编址单位决定存储字长与 MAR 位数:按字编址时单元总数 = 容量 ÷ 字长字节数
  • 指令字长必须是编址单位的整数倍,23 位按字节编址要圆整到 24 位
  • ISA = 软件可见的部分(指令格式、寄存器个数、寻址方式、中断模型);主频、流水线级数、Cache 属微架构
  • 卷面按位段图答题,标出各字段的位区间;编码时未用字段补 0

解题动作清单

指令格式题的第一小问几乎都是"字段位宽 ↔ 规模"的互推,三步走:

  1. 照题面把位段表画出来,标出每段的名字和位宽([31:26] 这种形式)
  2. 逐字段做 2k 换算:操作码 → 指令条数;寄存器号 → 寄存器个数;形式地址 → 寻址范围(先判无符号还是补码)
  3. 凡涉及主存,先确认编址单位,再算单元总数 → MAR 位数;MDR 位数 = 存储字长

收尾检查两条:指令字长是不是编址单位的整数倍未用字段有没有补 0

教材出处

  • 袁春风《计算机组成与系统结构(第 3 版)》§4.2 指令格式:图 4.5(p104)

真题练习