5-1指令系统概述

指令需提供的四类信息

每条指令需显式或隐式提供执行的操作、操作数的来源、操作结果的存放处、下一条指令的地址
这四类信息,下一条指令地址通常隐含在程序计数器 PC 中,仅转移指令需显式给出目的地址

一台计算机中所有指令的集合称为该计算机的指令集,也叫指令系统。

5-2-1指令格式:指令的一般格式和指令字长

指令一般由操作码字段(用 OP 表示,指明加减移位传送等操作)和地址码字段(用 A 表示,指明操作数,操作数获取方式由寻址方式决定

定长指令系统 变长指令系统
指令长度固定 指令长度可变
结构简单,有利于指令顺序寻址、取指和译码 结构灵活,给取指和译码带来不便,取指过程可能涉及多次访存操作
硬件实现较容易 硬件实现难度较大
平均指令长度较长、冗余状态较多(浪费存储器空间) 平均指令长度较短、冗余状态较少
受指令长度限制,不容易扩展 不受指令长度限制,可扩展性好
在精简指令集计算机(RISC)中较为常用,例如 MIPS 系列 在复杂指令集计算机(CISC)中采用,例如 Intel x86 系列

指令字长越长,则占用主存空间就越大,所耗费的访存时间也就越长。

根据指令字长与机器字长的关系,指令可分为以下三类:

  • 半字长指令:CPU 进行 1 次访存,可读取 2 条
  • 单字长指令:CPU 进行 1 次访存,可读取 1 条
  • 多字长指令:需要进行多次访存

为了提高速度,一般会将最常用的指令设计为较短的指令格式。

5-2-2指令格式:指令中的地址码

image-20251022211154514

分类维度 三地址指令 二地址指令 一地址指令 零地址指令
地址码数量 / 结构 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 调整指令)

三地址指令

image-20251022211455465

  • 若操作码字段 8 位、3 个地址码各 8 位,则指令字长 = 8+8+8+8=32 位,寻址范围 = 2⁸=256

二地址指令

image-20251022211633393

  • 类型细分(按地址指向存储位置):
    • 寄存器 - 寄存器型:原操作数和目的操作数均存于寄存器
    • 寄存器 - 存储器型:原操作数和目的操作数分别存于寄存器、主存
    • 存储器 - 存储器型:原操作数和目的操作数均存于主存
    • 访问速度从上到下依次变慢
  • 访问速度对比:寄存器 - 寄存器型 > 寄存器 - 存储器型 > 存储器 - 存储器型(主存访问速度远慢于寄存器)

一地址指令

image-20251022212228754

5-2-3指令格式:指令中的操作码字段

定长操作码

  • 操作码的长度固定,并且其在指令中的位置也是固定的。

  • 指令译码简单,硬件实现简单。

  • 指令系统的规模(指令系统所包含的指令数量),决定了操作码的位数。

    若指令系统所包含的指令数量为$x$,操作码的位数为$n$,则$x$和$n$应满足如下关系:$\log_{2}x \leq n$

变长操作码

  • 操作码的长度可变,并且其在指令中的位置也不固定。
  • 可以有效减少操作码的平均长度,用较短的指令字长表示了更多的指令,并且给地址码留出了更多位数,以增大寻址空间

变长操作码的常见实现方法 —— 扩展操作码技术

image-20251022213637038

例题

image-20251022220259724

image-20251022220326942

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 个字节”)。

image-20251024163111544

(二)跳跃寻址

1. 适用场景

当程序指令序列中包含分支指令(基于条件改变执行顺序,如 “if-else” 对应的指令)或跳转指令(无条件改变执行顺序,如 “goto” 对应的指令)时,程序执行流程会偏离顺序,需通过 “跳跃寻址” 寻找下一条指令地址。

2. 核心逻辑

下一条指令的地址不依赖 PC 自动加 N(N 为指令字长),而是由 “当前执行的指令内容”+“需测试的条件” 共同决定

image-20251024163328095

5-3-2指令寻址方式

不同指令需通过不同寻址方式获取操作数,因此将指令格式中 “地址码字段” 拆分为两部分:

  • 寻址方式字段(寻址特征字段):用M表示,位数由支持的寻址方式数量决定(如支持 8 种寻址方式则需 3 位)。
  • 形式地址字段:用D表示,存储与地址相关的数值(可能是操作数、地址、寄存器编号等)。
  • image-20251024164019180

(一)立即寻址方式

  1. 核心逻辑:形式地址D就是操作数本身,寻址方式字段M为特征码(如000)。
  2. 存储与获取流程
    • 操作数与指令一起存于主存
    • 取指令时,操作数随指令一同读入 CPU 的指令寄存器(IR);
    • 执行指令时,直接从 IR 中获取操作数,无需额外访问存储单元
  3. 特点
    • 优点:取数速度快(无需访存);
    • 缺点:形式地址字段位宽有限,限制操作数表示范围(如 16 位字段最多表示 ±32767);
    • 用途:常用于给变量赋初值。

(二)直接寻址方式

  1. 核心逻辑:形式地址D是操作数在主存中的有效地址,寻址方式字段M为特征码(如001)。
  2. 存储与获取流程
    • 操作数与指令分开存于主存
    • 取指令时,仅读入指令(不含操作数);
    • 执行指令时,需访问 1 次主存(根据D对应的地址读取操作数)。
  3. 特点
    • 优点:操作数地址直观,无需计算地址;
    • 缺点:形式地址位宽限制寻址范围,且操作数地址写死在指令中,修改不便;
    • 用途:适用于访问固定地址的操作数(如固定存储的常量)。

image-20251024163809461

(三)寄存器寻址方式

  1. 核心逻辑:形式地址D通用寄存器编号(如01代表EBX),操作数存于该寄存器中,寻址方式字段M为特征码(如010)。

  2. 存储与获取流程

    • 操作数存于 CPU 内的通用寄存器,指令存于主存;
    • 取指令时,仅读入指令;
    • 执行指令时,仅访问寄存器,无需访问主存
  3. 特点

    • 优点:执行速度快(寄存器访问速度远高于主存),且寄存器编号位数少(如 8 个寄存器仅需 3 位),可缩短指令字长;
    • 缺点:寄存器数量有限(通常十几个到几十个),无法存储大量操作数;
    • 用途:频繁使用的临时变量(如循环计数器)。

    image-20251024163923378

(四)间接寻址方式

  1. 核心逻辑:形式地址D间接地址(指向一个存储单元),该存储单元的内容才是操作数的 “有效地址”,寻址方式字段M为特征码(如011)。

  2. 存储与获取流程

    (以单极间接为例):

    • 操作数、间接地址、指令均分开存于主存
    • 取指令时,仅读入指令;
    • 执行指令时,需访问 2 次主存:①根据D读取间接地址对应的存储单元,获取有效地址;②根据有效地址读取操作数。
  3. 特点

    • 优点:用短形式地址扩展寻址范围(如 16 位D可指向 32 位有效地址,寻址范围从 64K 扩展到 4G),修改操作数地址只需改间接地址单元,无需改指令;
    • 缺点:需两次访存,指令执行速度慢;
    • 拓展:存在 “多重间接寻址”(间接地址指向的单元仍为间接地址,需多次访存,实际较少用)。
    • image-20251024164246798

(五)寄存器间接寻址方式

  1. 核心逻辑:形式地址D通用寄存器编号,该寄存器中存储的是 “操作数的主存有效地址”,寻址方式字段M为特征码(如100)。
  2. 存储与获取流程
    • 操作数存于主存,有效地址存于寄存器,指令存于主存;
    • 取指令时,仅读入指令;
    • 执行指令时,需访问 1 次主存:先从寄存器获取有效地址,再去主存读操作数。
  3. 特点
    • 优点:兼顾 “间接寻址的范围扩展性” 和 “寄存器的快速访问”,比间接寻址少 1 次访存;
    • 缺点:寄存器数量有限,无法存储大量操作数的有效地址;
    • 用途:数组访问(寄存器存储数组首地址,通过偏移量动态计算元素地址)。

image-20251024164938949

(六)相对寻址方式

  1. 核心逻辑:形式地址D是相对于程序计数器(PC)的偏移量(用补码表示,可正可负),有效地址EA = (PC) + D,寻址方式字段M为特征码(如101),可形成操作数存储地址或程序转移目标地址。

  2. 存储与获取流程

(以获取操作数为例):

  • 操作数与指令分开存于主存,指令存于指令区,操作数存于数据区;

  • 取指令时,仅读入指令,且取指完成后,PC 自动加 “指令字长”(如 16 位指令加 2 字节),指向 “下一条指令地址”;

  • 执行指令时,先对指令译码,识别为相对寻址后,需访问 1 次主存:①计算EA = (PC) + D;②根据 EA 访问主存,读取操作数(若为转移场景,则直接跳转到 EA 对应的指令地址)。

  1. 特点
  • 优点:程序设计只需关注 “指令与操作数的相对距离”,无需关心操作数绝对地址,可实现共享代码浮动(代码可加载到主存任意区域仍正常执行),利于代码重用;

  • 缺点:偏移量范围受形式地址位宽限制,且依赖 PC 当前值,若 PC 值异常会导致寻址错误;

  • 用途:除获取操作数外,核心用于程序跳转(如分支语句、循环语句的跳转指令)。

  • image-20251024165958968

  • 例题image-20251024171124214

(七)变址寻址方式

  1. 核心逻辑:形式地址D是固定偏移量,指令中含 “寄存器编号字段”,指定变址寄存器(通用或专用寄存器),有效地址EA = (变址寄存器) + D,寻址方式字段M为特征码(如110)。

    image-20251024171802897

  2. 存储与获取流程

  • 操作数存于主存数据区,变址寄存器存 “动态变化的地址偏移量”,指令存于主存指令区;

  • 取指令时,仅读入指令(含寄存器编号和形式地址D),操作数不随指令进入指令寄存器(IR);

  • 执行指令时,需访问 1 次主存:①根据寄存器编号找到变址寄存器,提取其内容;②计算EA = (变址寄存器) + D;③根据 EA 访问主存,读取操作数。

  • image-20251024171849859

  1. 特点
  • 优点:变址寄存器内容可由用户修改(动态变化),形式地址D固定,且变址寄存器位数>形式地址位数,可扩大寻址范围(覆盖整个主存);

  • 缺点:依赖变址寄存器资源,若需同时处理多个动态地址,可能占用过多寄存器;

  • 用途:核心用于访问数组元素(D存数组首地址,变址寄存器存 “元素下标”,循环修改下标即可遍历数组),如英特尔 X86 指令中 “MOV EAX, [ESI + 32]”(ESI 为变址寄存器,32 为D)。

(八)基址寻址方式

  1. 核心逻辑:形式地址D是用户编程使用的 “虚拟地址”,指令中含 “寄存器编号字段”,指定基址寄存器,有效地址EA = (基址寄存器) + D,寻址方式字段M为特征码(如111),表面与变址寻址类似,但角色完全不同。

    image-20251024172700405

  2. 存储与获取流程

(多道程序环境下):

  • 操作数存于主存物理地址空间,基址寄存器存 “系统分配的程序基地址”(物理地址),指令存于主存指令区;

  • 取指令时,仅读入指令(含寄存器编号和虚拟地址D);

  • 执行指令时,需访问 1 次主存:①根据寄存器编号找到基址寄存器(内容仅系统可改,对用户透明);②计算EA = (基址寄存器) + D(完成虚拟地址到物理地址的转换);③根据 EA 访问主存,读取操作数。

  1. 特点
  • 优点:面向系统,核心用于程序重定位(多道程序可加载到主存任意物理区域,通过修改基址寄存器实现地址转换),用户无需关心物理地址,简化编程;

  • 缺点:基址寄存器内容仅能由操作系统或系统管理程序通过 “特权指令” 设置,用户无法干预,灵活性受限;

  • 用途:多道程序设计、虚拟内存管理中,实现 “虚拟地址到物理地址的映射”。

寻址方式 面向对象 主要用途 寄存器特点 形式地址特点 补充说明
变址寻址 用户 处理程序循环问题(如数组元素访问) 变址寄存器内容可变 值保持不变 程序执行过程中,用户可改变变址寄存器内容来实现指令或操作数的寻址
基址寻址 系统 程序的重定位 基址寄存器内容不变 值可变 多道程序设计中,用户编程用虚拟地址,系统管理程序载入用户程序时分配基地址并载入基址寄存器,实现虚拟地址到物理地址转换;基址寄存器内容仅能由操作系统或系统管理程序通过特权指令设置,对用户透明,用户通过改变形式地址 D 寻址
这三种寻址方式可以统称为偏移寻址

image-20251024173118238

(九)堆栈寻址方式

  1. 核心逻辑:针对 “堆栈”(按后进先出 LIFO 管理的存储区)的寻址方式,分为寄存器堆栈和存储器堆栈,目前普遍采用存储器堆栈(软堆栈),需通过 “堆栈指针(SP)” 记录栈顶地址,无单独形式地址字段,通过栈操作指令(如 PUSH、POP)触发寻址。

  2. 存储与获取流程

(以 “SP 指向栈顶、堆栈向下增长、主存按字节编址” 为例):

  • 操作数存于主存的 “堆栈区域”,SP 存栈顶地址,指令存于主存指令区;

  • 入栈(如 PUSH D):①SP 先减 1(指向新栈顶,减 1 以 “数据宽度” 为单位,字节编址则减 1);②将操作数 D 存入 SP 指向的栈顶单元(无需访问主存计算地址,直接用 SP 寻址);

  • 出栈(如 POP R):①从 SP 指向的栈顶单元读取操作数,送入目标寄存器 R(访问 1 次主存);②SP 加 1(指向新栈顶)。

  1. 特点
  • 优点:无需指定操作数地址,通过 SP 自动寻址,简化指令格式;栈操作高效,适合存储函数调用参数、返回地址、运算中间结果;

  • 缺点:寄存器堆栈成本高、容量小(极少用);存储器堆栈容量依赖主存,若栈溢出会导致数据错误;

  • 用途:函数调用与返回(保存返回地址、参数)、中断处理(保存 CPU 现场)、算术表达式求值(如逆波兰表达式计算)。

(十)复合寻址方式

  1. 核心逻辑:将两种基础寻址方式组合,形成更复杂的寻址逻辑,用于复杂指令集计算机(如英特尔 X86 体系),常见组合为 “基础寻址 + 间接寻址”,有效地址需经多步计算,无固定特征码,由组合的基础寻址方式特征码共同标识。

  2. 存储与获取流程

(以 “变址寻址 + 间接寻址” 为例):

  • 操作数、“存有效地址的单元”、变址寄存器、指令均分开存储:操作数存于主存数据区,“存有效地址的单元” 存于主存地址区,变址寄存器存动态偏移量;

  • 取指令时,仅读入指令(含变址寄存器编号、形式地址D);

  • 执行指令时,需访问 2 次主存:①先执行变址寻址:计算A = (变址寄存器) + D(A为 “存有效地址的单元地址”);②再执行间接寻址:访问主存A单元,获取操作数的有效地址 EA;③根据 EA 访问主存,读取操作数(共 2 次访存)。

  1. 特点
  • 优点:结合多种寻址方式的优势,可应对复杂的地址计算场景(如访问多维数组、链表中的嵌套数据),扩大寻址灵活性;

  • 缺点:寻址步骤多,需多次访存,指令执行速度慢;指令逻辑复杂,增加 CPU 译码难度;

  • 常见组合及用途:①相对寻址 + 间接寻址:用于动态获取跳转目标地址;②间接寻址 + 变址寻址:用于访问 “地址存于其他单元的数组”,如链表节点中的数组数据。

总结

image-20251024173617579

image-20250926155030692

image-20250926172000068

![image-20250926201435614](C:\Users\woodfish\Desktop\MyBlog\计算机组成原理\指令系统.assets\image-20250926201435614.png

  • 形式地址(A):指令中给出的地址字段。
  • 有效地址(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 为堆栈指针) 适用于零地址指令,遵循 “先进后出” 原则,用于子程序调用、中断处理