指令系统
5-1指令系统概述
指令需提供的四类信息
每条指令需显式或隐式提供执行的操作、操作数的来源、操作结果的存放处、下一条指令的地址
这四类信息,下一条指令地址通常隐含在程序计数器 PC 中,仅转移指令需显式给出目的地址
一台计算机中所有指令的集合称为该计算机的指令集,也叫指令系统。
5-2-1指令格式:指令的一般格式和指令字长
指令一般由操作码字段(用 OP 表示,指明加减移位传送等操作)和地址码字段(用 A 表示,指明操作数,操作数获取方式由寻址方式决定
| 定长指令系统 | 变长指令系统 |
|---|---|
| 指令长度固定 | 指令长度可变 |
| 结构简单,有利于指令顺序寻址、取指和译码 | 结构灵活,给取指和译码带来不便,取指过程可能涉及多次访存操作 |
| 硬件实现较容易 | 硬件实现难度较大 |
| 平均指令长度较长、冗余状态较多(浪费存储器空间) | 平均指令长度较短、冗余状态较少 |
| 受指令长度限制,不容易扩展 | 不受指令长度限制,可扩展性好 |
| 在精简指令集计算机(RISC)中较为常用,例如 MIPS 系列 | 在复杂指令集计算机(CISC)中采用,例如 Intel x86 系列 |
指令字长越长,则占用主存空间就越大,所耗费的访存时间也就越长。
根据指令字长与机器字长的关系,指令可分为以下三类:
- 半字长指令:CPU 进行 1 次访存,可读取 2 条
- 单字长指令:CPU 进行 1 次访存,可读取 1 条
- 多字长指令:需要进行多次访存
为了提高速度,一般会将最常用的指令设计为较短的指令格式。
5-2-2指令格式:指令中的地址码
| 分类维度 | 三地址指令 | 二地址指令 | 一地址指令 | 零地址指令 |
|---|---|---|---|---|
| 地址码数量 / 结构 | 3 个地址码(前 2 个为原操作数地址,第 3 个为目的操作数地址) | 2 个地址码(均为原操作数地址,第 1 个同时作为目的操作数地址) | 1 个地址码(分两种情况:① 兼作原 / 目的操作数地址;② 仅作原操作数地址,另一个原操作数 + 目的地址隐含) | 0 个地址码(仅含操作码字段) |
| 运算类型 | 双目运算(需 2 个操作数) | 双目运算(需 2 个操作数) | ① 单目运算(仅 1 个操作数,如逻辑求反);② 双目运算(1 个操作数隐含) | ① 无需操作数;② 需 1 个操作数(隐含) |
| 指令长度优化方式 | 多采用寄存器地址(而非存储单元地址)缩短长度 | 结果覆盖原操作数 1 地址,压缩指令长度 | 隐含部分操作数地址,进一步缩短双目运算指令长度 | 完全省略地址码,仅保留操作码 |
| 典型实例 | MIPS 指令(地址码为寄存器地址);操作码 8 位 + 3 个地址码各 8 位→32 位指令字长 | 英特尔 X86 的寄存器 - 存储器型指令;MIPS 的寄存器 - 寄存器型指令 | X86 的逻辑求反指令(单目);X86 的乘法指令(AL 隐含原操作数,AX 存结果) | X86 的 NOP(空指令)、WAIT(等待指令);X86 的 DAA(加法 BCD 调整指令) |
| 寻址范围示例 | 地址码 8 位时,寻址范围 = 2⁸=256 | 地址码 8 位时,寻址范围 = 2⁸=256 | 地址码 8 位时,寻址范围 = 2⁸=256(隐含地址无需额外位数) | 无地址码,无显式寻址范围 |
| 核心优势 | 操作数 / 结果地址独立,逻辑清晰 | 兼顾双目运算需求与指令长度优化 | 单目运算简洁,双目运算进一步压缩指令长度 | 指令长度最短,适用于无操作数或操作数固定隐含场景 |
| 典型应用架构 | MIPS 架构(常用寄存器地址) | 英特尔 X86(寄存器 - 寄存器 / 寄存器 - 存储器型)、MIPS(寄存器 - 寄存器型) | 英特尔 X86(隐含 AL/AX 等寄存器) | 英特尔 X86(系统控制类指令、BCD 调整指令) |
三地址指令
- 若操作码字段 8 位、3 个地址码各 8 位,则指令字长 = 8+8+8+8=32 位,寻址范围 = 2⁸=256
二地址指令
- 类型细分(按地址指向存储位置):
- 寄存器 - 寄存器型:原操作数和目的操作数均存于寄存器
- 寄存器 - 存储器型:原操作数和目的操作数分别存于寄存器、主存
- 存储器 - 存储器型:原操作数和目的操作数均存于主存
- 访问速度从上到下依次变慢
- 访问速度对比:寄存器 - 寄存器型 > 寄存器 - 存储器型 > 存储器 - 存储器型(主存访问速度远慢于寄存器)
一地址指令
5-2-3指令格式:指令中的操作码字段
定长操作码
-
操作码的长度固定,并且其在指令中的位置也是固定的。
-
指令译码简单,硬件实现简单。
-
指令系统的规模(指令系统所包含的指令数量),决定了操作码的位数。
若指令系统所包含的指令数量为$x$,操作码的位数为$n$,则$x$和$n$应满足如下关系:$\log_{2}x \leq n$
变长操作码
- 操作码的长度可变,并且其在指令中的位置也不固定。
- 可以有效减少操作码的平均长度,用较短的指令字长表示了更多的指令,并且给地址码留出了更多位数,以增大寻址空间。
变长操作码的常见实现方法 —— 扩展操作码技术
例题
5-3-2指令寻址方式
(一)顺序寻址
1. 核心定义
- 程序的机器指令通常在存储器中按顺序存放,多数情况下程序也按指令序列顺序执行。
- 若已知指令序列中第一条指令的有效地址,只需在该地址基础上,增加一条指令占用的存储单元数量,即可得到下一条指令的有效地址,这种地址寻找方法称为 “顺序寻址”。
2. 关键硬件:程序计数器(PC)的变化规律
PC 的核心作用是 “指向当前要读取的指令地址”,读取指令后会自动更新,以指向后续指令,具体变化由 “指令字长” 决定(存储器按字节编制):
| 案例 | 计算机位数 | 指令字长 | 单条指令占用存储单元 | PC 更新规则(读取指令后) | 实例细节 |
|---|---|---|---|---|---|
| 例 1 | 8 位 | 8 位 | 1 个字节单元 | PC 自动加 1 | 初始 PC=0X16(指向指令一)→ 读指令一→ PC=0X17(指向下一条指令) |
| 例 2 | 16 位 | 16 位 | 2 个字节单元 | PC 自动加 2 | 初始 PC=0X0016(指向指令一的第一个字节)→ 读指令一→ PC=0X0018(指向下一条指令的第一个字节) |
3. 注意点
通常简化描述为 “每读一条指令,PC 自动加 1”,但这里的 “1” 本质是 “以字节为单位的指令字长”(例 2 中 “加 2” 本质是 “1 个 16 位指令字长 = 2 个字节”)。
(二)跳跃寻址
1. 适用场景
当程序指令序列中包含分支指令(基于条件改变执行顺序,如 “if-else” 对应的指令)或跳转指令(无条件改变执行顺序,如 “goto” 对应的指令)时,程序执行流程会偏离顺序,需通过 “跳跃寻址” 寻找下一条指令地址。
2. 核心逻辑
下一条指令的地址不依赖 PC 自动加 N(N 为指令字长),而是由 “当前执行的指令内容”+“需测试的条件” 共同决定
5-3-2指令寻址方式
不同指令需通过不同寻址方式获取操作数,因此将指令格式中 “地址码字段” 拆分为两部分:
- 寻址方式字段(寻址特征字段):用
M表示,位数由支持的寻址方式数量决定(如支持 8 种寻址方式则需 3 位)。 - 形式地址字段:用
D表示,存储与地址相关的数值(可能是操作数、地址、寄存器编号等)。
(一)立即寻址方式
- 核心逻辑:形式地址
D就是操作数本身,寻址方式字段M为特征码(如000)。 - 存储与获取流程
- 操作数与指令一起存于主存;
- 取指令时,操作数随指令一同读入 CPU 的指令寄存器(IR);
- 执行指令时,直接从 IR 中获取操作数,无需额外访问存储单元。
- 特点
- 优点:取数速度快(无需访存);
- 缺点:形式地址字段位宽有限,限制操作数表示范围(如 16 位字段最多表示 ±32767);
- 用途:常用于给变量赋初值。
(二)直接寻址方式
- 核心逻辑:形式地址
D是操作数在主存中的有效地址,寻址方式字段M为特征码(如001)。 - 存储与获取流程
- 操作数与指令分开存于主存;
- 取指令时,仅读入指令(不含操作数);
- 执行指令时,需访问 1 次主存(根据
D对应的地址读取操作数)。
- 特点
- 优点:操作数地址直观,无需计算地址;
- 缺点:形式地址位宽限制寻址范围,且操作数地址写死在指令中,修改不便;
- 用途:适用于访问固定地址的操作数(如固定存储的常量)。
(三)寄存器寻址方式
-
核心逻辑:形式地址
D是通用寄存器编号(如01代表EBX),操作数存于该寄存器中,寻址方式字段M为特征码(如010)。 -
存储与获取流程
- 操作数存于 CPU 内的通用寄存器,指令存于主存;
- 取指令时,仅读入指令;
- 执行指令时,仅访问寄存器,无需访问主存。
-
特点
- 优点:执行速度快(寄存器访问速度远高于主存),且寄存器编号位数少(如 8 个寄存器仅需 3 位),可缩短指令字长;
- 缺点:寄存器数量有限(通常十几个到几十个),无法存储大量操作数;
- 用途:频繁使用的临时变量(如循环计数器)。
(四)间接寻址方式
-
核心逻辑:形式地址
D是间接地址(指向一个存储单元),该存储单元的内容才是操作数的 “有效地址”,寻址方式字段M为特征码(如011)。 -
存储与获取流程
(以单极间接为例):
- 操作数、间接地址、指令均分开存于主存;
- 取指令时,仅读入指令;
- 执行指令时,需访问 2 次主存:①根据
D读取间接地址对应的存储单元,获取有效地址;②根据有效地址读取操作数。
-
特点
- 优点:用短形式地址扩展寻址范围(如 16 位
D可指向 32 位有效地址,寻址范围从 64K 扩展到 4G),修改操作数地址只需改间接地址单元,无需改指令; - 缺点:需两次访存,指令执行速度慢;
- 拓展:存在 “多重间接寻址”(间接地址指向的单元仍为间接地址,需多次访存,实际较少用)。
- 优点:用短形式地址扩展寻址范围(如 16 位
(五)寄存器间接寻址方式
- 核心逻辑:形式地址
D是通用寄存器编号,该寄存器中存储的是 “操作数的主存有效地址”,寻址方式字段M为特征码(如100)。 - 存储与获取流程
- 操作数存于主存,有效地址存于寄存器,指令存于主存;
- 取指令时,仅读入指令;
- 执行指令时,需访问 1 次主存:先从寄存器获取有效地址,再去主存读操作数。
- 特点
- 优点:兼顾 “间接寻址的范围扩展性” 和 “寄存器的快速访问”,比间接寻址少 1 次访存;
- 缺点:寄存器数量有限,无法存储大量操作数的有效地址;
- 用途:数组访问(寄存器存储数组首地址,通过偏移量动态计算元素地址)。
(六)相对寻址方式
-
核心逻辑:形式地址D是相对于程序计数器(PC)的偏移量(用补码表示,可正可负),有效地址EA = (PC) + D,寻址方式字段M为特征码(如101),可形成操作数存储地址或程序转移目标地址。
-
存储与获取流程
(以获取操作数为例):
-
操作数与指令分开存于主存,指令存于指令区,操作数存于数据区;
-
取指令时,仅读入指令,且取指完成后,PC 自动加 “指令字长”(如 16 位指令加 2 字节),指向 “下一条指令地址”;
-
执行指令时,先对指令译码,识别为相对寻址后,需访问 1 次主存:①计算EA = (PC) + D;②根据 EA 访问主存,读取操作数(若为转移场景,则直接跳转到 EA 对应的指令地址)。
- 特点
-
优点:程序设计只需关注 “指令与操作数的相对距离”,无需关心操作数绝对地址,可实现共享代码浮动(代码可加载到主存任意区域仍正常执行),利于代码重用;
-
缺点:偏移量范围受形式地址位宽限制,且依赖 PC 当前值,若 PC 值异常会导致寻址错误;
-
用途:除获取操作数外,核心用于程序跳转(如分支语句、循环语句的跳转指令)。
-
-
例题
(七)变址寻址方式
-
核心逻辑:形式地址D是固定偏移量,指令中含 “寄存器编号字段”,指定变址寄存器(通用或专用寄存器),有效地址EA = (变址寄存器) + D,寻址方式字段M为特征码(如110)。
-
存储与获取流程
-
操作数存于主存数据区,变址寄存器存 “动态变化的地址偏移量”,指令存于主存指令区;
-
取指令时,仅读入指令(含寄存器编号和形式地址D),操作数不随指令进入指令寄存器(IR);
-
执行指令时,需访问 1 次主存:①根据寄存器编号找到变址寄存器,提取其内容;②计算EA = (变址寄存器) + D;③根据 EA 访问主存,读取操作数。
-
- 特点
-
优点:变址寄存器内容可由用户修改(动态变化),形式地址D固定,且变址寄存器位数>形式地址位数,可扩大寻址范围(覆盖整个主存);
-
缺点:依赖变址寄存器资源,若需同时处理多个动态地址,可能占用过多寄存器;
-
用途:核心用于访问数组元素(D存数组首地址,变址寄存器存 “元素下标”,循环修改下标即可遍历数组),如英特尔 X86 指令中 “MOV EAX, [ESI + 32]”(ESI 为变址寄存器,32 为D)。
(八)基址寻址方式
-
核心逻辑:形式地址D是用户编程使用的 “虚拟地址”,指令中含 “寄存器编号字段”,指定基址寄存器,有效地址EA = (基址寄存器) + D,寻址方式字段M为特征码(如111),表面与变址寻址类似,但角色完全不同。
-
存储与获取流程
(多道程序环境下):
-
操作数存于主存物理地址空间,基址寄存器存 “系统分配的程序基地址”(物理地址),指令存于主存指令区;
-
取指令时,仅读入指令(含寄存器编号和虚拟地址D);
-
执行指令时,需访问 1 次主存:①根据寄存器编号找到基址寄存器(内容仅系统可改,对用户透明);②计算EA = (基址寄存器) + D(完成虚拟地址到物理地址的转换);③根据 EA 访问主存,读取操作数。
- 特点
-
优点:面向系统,核心用于程序重定位(多道程序可加载到主存任意物理区域,通过修改基址寄存器实现地址转换),用户无需关心物理地址,简化编程;
-
缺点:基址寄存器内容仅能由操作系统或系统管理程序通过 “特权指令” 设置,用户无法干预,灵活性受限;
-
用途:多道程序设计、虚拟内存管理中,实现 “虚拟地址到物理地址的映射”。
| 寻址方式 | 面向对象 | 主要用途 | 寄存器特点 | 形式地址特点 | 补充说明 |
|---|---|---|---|---|---|
| 变址寻址 | 用户 | 处理程序循环问题(如数组元素访问) | 变址寄存器内容可变 | 值保持不变 | 程序执行过程中,用户可改变变址寄存器内容来实现指令或操作数的寻址 |
| 基址寻址 | 系统 | 程序的重定位 | 基址寄存器内容不变 | 值可变 | 多道程序设计中,用户编程用虚拟地址,系统管理程序载入用户程序时分配基地址并载入基址寄存器,实现虚拟地址到物理地址转换;基址寄存器内容仅能由操作系统或系统管理程序通过特权指令设置,对用户透明,用户通过改变形式地址 D 寻址 |
这三种寻址方式可以统称为偏移寻址
(九)堆栈寻址方式
-
核心逻辑:针对 “堆栈”(按后进先出 LIFO 管理的存储区)的寻址方式,分为寄存器堆栈和存储器堆栈,目前普遍采用存储器堆栈(软堆栈),需通过 “堆栈指针(SP)” 记录栈顶地址,无单独形式地址字段,通过栈操作指令(如 PUSH、POP)触发寻址。
-
存储与获取流程
(以 “SP 指向栈顶、堆栈向下增长、主存按字节编址” 为例):
-
操作数存于主存的 “堆栈区域”,SP 存栈顶地址,指令存于主存指令区;
-
入栈(如 PUSH D):①SP 先减 1(指向新栈顶,减 1 以 “数据宽度” 为单位,字节编址则减 1);②将操作数 D 存入 SP 指向的栈顶单元(无需访问主存计算地址,直接用 SP 寻址);
-
出栈(如 POP R):①从 SP 指向的栈顶单元读取操作数,送入目标寄存器 R(访问 1 次主存);②SP 加 1(指向新栈顶)。
- 特点
-
优点:无需指定操作数地址,通过 SP 自动寻址,简化指令格式;栈操作高效,适合存储函数调用参数、返回地址、运算中间结果;
-
缺点:寄存器堆栈成本高、容量小(极少用);存储器堆栈容量依赖主存,若栈溢出会导致数据错误;
-
用途:函数调用与返回(保存返回地址、参数)、中断处理(保存 CPU 现场)、算术表达式求值(如逆波兰表达式计算)。
(十)复合寻址方式
-
核心逻辑:将两种基础寻址方式组合,形成更复杂的寻址逻辑,用于复杂指令集计算机(如英特尔 X86 体系),常见组合为 “基础寻址 + 间接寻址”,有效地址需经多步计算,无固定特征码,由组合的基础寻址方式特征码共同标识。
-
存储与获取流程
(以 “变址寻址 + 间接寻址” 为例):
-
操作数、“存有效地址的单元”、变址寄存器、指令均分开存储:操作数存于主存数据区,“存有效地址的单元” 存于主存地址区,变址寄存器存动态偏移量;
-
取指令时,仅读入指令(含变址寄存器编号、形式地址D);
-
执行指令时,需访问 2 次主存:①先执行变址寻址:计算A = (变址寄存器) + D(A为 “存有效地址的单元地址”);②再执行间接寻址:访问主存A单元,获取操作数的有效地址 EA;③根据 EA 访问主存,读取操作数(共 2 次访存)。
- 特点
-
优点:结合多种寻址方式的优势,可应对复杂的地址计算场景(如访问多维数组、链表中的嵌套数据),扩大寻址灵活性;
-
缺点:寻址步骤多,需多次访存,指令执行速度慢;指令逻辑复杂,增加 CPU 译码难度;
-
常见组合及用途:①相对寻址 + 间接寻址:用于动态获取跳转目标地址;②间接寻址 + 变址寻址:用于访问 “地址存于其他单元的数组”,如链表节点中的数组数据。
总结
:指令中给出的地址字段。
- 有效地址(EA):操作数在主存中的实际地址,需通过寻址方式将
A转换为EA。
| 寻址方式 | 有效地址计算 | 特点与应用 | 获取操作数需要的访存次数 |
|---|---|---|---|
| 立即寻址 | EA = ——(无有效地址,A 就是操作数) |
速度最快,无需访存;操作数范围受限 | 0 |
| 直接寻址 | EA = A |
简单直观;地址码长度决定寻址范围,灵活性差 | 1 |
| 间接寻址 | EA = (A)(A 是操作数地址的地址) |
寻址范围大;需两次访存,速度慢 | 2 |
| 寄存器寻址 | EA = 寄存器编号 |
速度快(无需访存);寄存器数量有限 | 0 |
| 寄存器间接寻址 | EA = (寄存器) |
结合寄存器和主存优势,寻址范围大 | 1 |
| 变址寻址 | EA = (变址寄存器) + A |
A 为偏移量,适合数组、字符串等连续存储的数据访问 | 1 |
| 基址寻址 | EA = (基址寄存器) + A |
A 为偏移量,适合多道程序的内存分配,基址寄存器内容由操作系统设置 | 1 |
| 相对寻址 | EA = (PC) + A |
A 为相对偏移量(可正可负),适合跳转指令,指令地址无关性强 | |
| 堆栈寻址 | EA = (SP)(SP 为堆栈指针) |
适用于零地址指令,遵循 “先进后出” 原则,用于子程序调用、中断处理 |

























