文章目录
- 前言
-
- (一):指令系统的基本概念
-
- [1. 指令与指令系统](#1. 指令与指令系统)
- [2. 指令集体系结构(ISA)](#2. 指令集体系结构(ISA))
-
- [1. 核心概念辨析:ISA vs 微架构](#1. 核心概念辨析:ISA vs 微架构)
- [2. 两种主流 ISA 设计风格对比](#2. 两种主流 ISA 设计风格对比)
- [3. ISA 在整个计算机系统中的位置](#3. ISA 在整个计算机系统中的位置)
- [2. 指令字长、机器字长与存储字长](#2. 指令字长、机器字长与存储字长)
- (二):指令格式
-
- [1. 指令的基本组成](#1. 指令的基本组成)
- [2. 按操作数地址码数目分类的 5 种指令](#2. 按操作数地址码数目分类的 5 种指令)
- [3. 按操作码长度是否固定分类](#3. 按操作码长度是否固定分类)
- [4. 按操作类型分类](#4. 按操作类型分类)
- (三):寻址方式
-
- [1. 指令寻址](#1. 指令寻址)
- [2. 数据寻址](#2. 数据寻址)
- (四):核心知识对比总结
- 总结
前言
本文旨在帮助计算机专业学生及考研备考者系统梳理"指令系统"的核心知识体系。从指令的基本概念、指令集架构(ISA),到最容易被混淆的 10 种数据寻址方式,都力求做到条理清晰、考点突出。无论你是初次学习计算机组成原理,还是正在备战 408 统考,都能通过本文建立起完整的知识框架,轻松应对指令格式、基址与变址辨析、访存次数计算等高频考点。
(一):指令系统的基本概念
1. 指令与指令系统
- 指令:计算机运行的最小功能单位。
- 指令系统:一台计算机所有指令的集合,它处于硬件和软件的交界面上,决定了计算机的基本功能。
- 一、一句话刻在脑子里
2. 指令集体系结构(ISA)
指令系统只是ISA的一部分。 ISA是软件与硬件之间一份完整的"合同",它定义了程序员(或编译器)编写机器级程序时可见的所有硬件特性,但不规定硬件如何实现
- 对软件(编译器、操作系统)来说:你只负责按这份合同写代码,不用管下面是什么 CPU。
- 对硬件(CPU 设计师)来说:你只要保证这份合同被完美执行,内部用什么技术,你说了算。
二、ISA 到底包含什么?(七大要素,逐条精讲)
| 序号 | 包含内容 | 通俗解释 | 408 考试关联 |
|---|---|---|---|
| 1 | 指令集 | 这台计算机的"单词本"。能执行的所有指令的集合。 | ADD、MOV、JMP、CALL 等 |
| 2 | 寄存器模型 | 程序员能用的"临时存放处"有哪些。 | 多少个通用寄存器?PC 是什么?PSW 存什么? |
| 3 | 寻址方式 | 数据能从哪里取?立即给?寄存器里拿?内存里找? | 立即、直接、间接、寄存器、基址、变址、相对寻址 |
| 4 | 数据表示 | 数据在机器里怎么存放?整数用补码?浮点数用 IEEE 754? | 有符号整数、浮点数、字符编码 |
| 5 | 存储器模型 | 内存怎么编址?按字节还是按字?地址是 32 位还是 64 位? | 按字节编址、寻址空间大小、大小端模式 |
| 6 | 中断与异常机制 | 发生中断时,硬件自动做什么?怎么找到服务程序? | 中断隐指令(关中断、保存断点、取中断向量) |
| 7 | I/O 模型 | CPU 怎么和外设沟通?用专用 IN/OUT 指令,还是直接用访存指令? | 独立编址 vs 统一编址 |
1. 核心概念辨析:ISA vs 微架构
ISA(指令集体系结构)
- 本质:一份规范 / 合同
- 比喻:篮球规则手册
- 谁定义:架构师(制定统一标准)
- 是否可变:同一系列的 CPU 必须完全相同
- 对软件:可见,编译器必须严格遵守
微架构(硬件具体实现)
- 本质:一个工程设计方案
- 比喻:某个具体的球馆(地板材质、灯光、座椅)
- 谁定义:芯片工程师(自由发挥)
- 是否可变:同一系列的每代产品可以完全不同
- 对软件:不可见,软件不用知道
经典实例
- ISA 相同:Intel Core i5、i7、i9 都是 x86 系列。
- 微架构不同:每一代产品(Skylake、Ice Lake、Raptor Lake)内部的流水线、缓存、执行单元设计全都不同。
- 结果 :你十年前的 Windows 软件,在今天最新款 Intel CPU 上照样能跑,因为 ISA 没变。
2. 两种主流 ISA 设计风格对比
| 维度 | RISC(精简指令集) | CISC(复杂指令集) |
|---|---|---|
| 指令集 | 指令少且简单,功能单一 | 指令多且复杂,功能强大 |
| 指令长度 | 定长(如全是 32 位) | 变长(1~15 字节) |
| 寻址方式 | 极少,以寄存器为主 | 极多,支持复杂内存操作 |
| 访存限制 | Load/Store 架构(只有取数/存数指令能访存) | 允许运算指令直接访问内存 |
| 控制器实现 | 硬布线控制器(快) | 微程序控制器(灵活) |
| I/O 模型 | 统一编址(用 LOAD/STORE 做 I/O) | 独立编址(专用 IN/OUT 指令) |
| 典型代表 | ARM、MIPS、RISC-V | x86 |
3. ISA 在整个计算机系统中的位置
text
┌─────────────────────────────────────────────┐
│ 应用软件(微信,游戏,浏览器) │
└─────────────────────┬───────────────────────┘
│
┌─────────────────────▼───────────────────────┐
│ 操作系统(Windows,Linux) │
└─────────────────────┬───────────────────────┘
│
┌─────────────────────▼───────────────────────┐
│ 编译器(将高级语言翻译成机器码) │
└─────────────────────┬───────────────────────┘
│
╔═══════════▼═════════════╗
║ ISA(软件/硬件分界线) ║
║ • 指令集 ║
║ • 寄存器模型 ║
║ • 寻址方式 ║
║ • 数据类型 ║
║ • 存储器模型 ║
║ • 中断/异常机制 ║
║ • I/O 模型 ║
╚═══════════▼═════════════╝
│
┌─────────────────────▼───────────────────────┐
│ 微架构(硬件具体实现,对软件透明) │
│ • 流水线深度?• 几发射?• 多少执行单元? │
│ • 缓存多大?• 分支预测算法?• 用什么工艺? │
└─────────────────────┬───────────────────────┘
│
┌─────────────────────▼───────────────────────┐
│ 数字逻辑电路(晶体管,与或非门) │
└─────────────────────────────────────────────┘
六、终极记忆口诀
ISA 是合同,微架构是施工方案;
CISC 指令复杂用微程序,RISC 指令精简用硬布线;
统一编址用 LOAD/STORE,独立编址用 IN/OUT;
合同不变软件恒通,施工万变硬件各异。
2. 指令字长、机器字长与存储字长
在理解指令格式前,需要厘清几个极易混淆的"字长"概念:
- 机器字长:计算机进行一次整数运算所能处理的二进制数据的位数(通常等于 CPU 内部寄存器宽度)。
- 指令字长 :指一条指令所占用的存储空间大小,通常为字节的整数倍。
- 半字长指令:指令长度 = 机器字长 / 2
- 单字长指令:指令长度 = 机器字长
- 双字长指令:指令长度 = 机器字长 × 2
- 数据字:某一个字表示的是一个数据。
- 指令字:某一个字表示的是一条指令。
(二):指令格式
1. 指令的基本组成
一条完整的指令,在逻辑上分为两部分:
[操作码 (Opcode)] + [地址码 (Address Code)]
- 操作码:指出该指令应执行什么性质的操作和具有何种功能。位置可以在主存,也可以在寄存器。
- 地址码 :指出被操作信息的地址(或数据本身)。作用:
① 指出操作数所在地址
② 指出操作后结果存放的地址
③ 指出下一条指令的地址 - 地址码可以表示的内容:可以是操作数本身(立即数)、操作数的地址、操作数地址的计算方法。
2. 按操作数地址码数目分类的 5 种指令
根据指令中地址码的个数,可将指令分为以下 5 类。考点提示:需要特别关注它们在指令执行阶段的"访存次数"。
零地址指令(| OP |)
- 格式:只有操作码,无地址码字段。
- 适用:不需要操作数的指令(如空操作、停机、关中断);或者操作数隐含在堆栈中的堆栈类指令(参与运算的两个数隐含从栈顶、次栈顶弹出,结果压入栈顶)。
一地址指令(| OP | A1 |)
- 适用情况 1:只有目的操作数的单操作数指令。
OP(A1) -> A1,如加 1、减 1、求反、求补。 - 适用情况 2:隐含约定目的地址的双操作数指令。另一个操作数由累加器 ACC 提供:
(ACC) OP (A1) -> ACC。
二地址指令(| OP | A1 | A2 |)
- 常用逻辑:
(A1) OP (A2) -> A2。A1 为源操作数地址,A2 为目的操作数地址。 - 适用:各类算术运算(加、减、乘、除)。
- 访存情况:操作数不一定都在内存,可以是一个/两个在寄存器。
三地址指令(| OP | A1 | A2 | A3(结果) |)
- 常用逻辑:
(A1) OP (A2) -> A3。A1、A2 为源操作数地址,A3 为结果存放地址。 - 访存情况:若均为内存地址,需要 4 次访存(取指 1 次 + 取操作数 A1 1 次 + 取操作数 A2 1 次 + 存放结果 A3 1 次)。
四地址指令(| OP | A1 | A2 | A3(结果) | A4(下址) |)
- 常用逻辑:
(A1) OP (A2) -> A3,A4 为下一条指令地址。 - 访存情况:若均为内存地址,同样需要 4 次访存。
知识笔记
3. 按操作码长度是否固定分类
- 定长操作码指令:指令最高位部分分配固定的若干位(定长)表示操作码。n 位操作码对应 2^n 条指令。硬件设计简单,但信息冗余。
- 扩展操作码指令 :操作码长度随地址码数量的变化而变化(地址码减少,操作码增加)。
设计原则:不允许较短的操作码成为较长操作码的前缀。
优化分配:频率高的指令分配较短的操作码(缩短指令长度);频率低的指令分配较长的操作码。
扩展计算:设地址码长度为 n,上一层留出 m 种状态,下一层就可以扩展出 m × 2^n 种状态。
4. 按操作类型分类
- 数据传送类:主要进行主存与 CPU 之间的数据传送。
- 运算类:算术运算和逻辑运算。
- 程序控制类:这类指令不处理数据本身,而是专门用来改变程序指令的执行顺序。它通过修改程序计数器(PC)的值来实现跳转、循环或调用。改变程序执行顺序(如跳转指令)。
- 输入输出类 :进行 CPU 与 I/O 设备之间的数据传送。

(三):寻址方式
寻址方式是指确定本条指令的操作数地址或下一条指令地址的方法。
- 指令寻址:确定下一条要执行指令的地址。
- 数据寻址:确定当前指令操作数的地址。
1. 指令寻址
顺序寻址:程序按顺序执行。下一条指令的地址 = (PC) + n(n 为当前指令字长)。注意,这里 n 与指令字长和按字节/字编址方式有关。
- 举例:若字长 16 位,按字编址,一条指令占 1 个字,则 PC+1;若按字节编址,则 PC+2。
- 定长指令可一次性预估下条指令位置。
跳跃寻址 :定义:通过执行跳转类指令,强行改变PC的值,使程序不再顺序执行,而是跳到指定的新地址

2. 数据寻址
数据在计算机中可能存在于内存 、寄存器 **、堆栈**、I/O 端口 或指令本身(立即数)中。数据寻址的核心是明确如何根据指令中的地址码(形式地址 A),计算出操作数的真实存放位置(有效地址 EA)。
以下为 408 考试的 10 种数据寻址方式 极致拆解:
① 立即寻址(Immediate Addressing)

- 操作:指令中直接给出了操作数(称为立即数),通常用 # 号标识。如
MOV AX, #10。 - 公式:有效地址 EA 无,操作数 = A。
- 优点:取指后即可获得操作数,只需访存一次(取指令),执行阶段不再访问内存,速度极快。
- 缺点:A 的位数限制了立即数表示范围。例如 A 为 8 位时范围仅为 -128~127。
- 用途:通常用于对某寄存器或内存单元赋初值。
② 直接寻址(Direct Addressing)

- 操作:指令中的形式地址 A 就是操作数的真实地址。EA = A。
- 公式:EA = A。
- 访存次数:2 次(取指 1 次 + 取操作数 1 次)。
- 优点:简单直观,不需要经过变换。
- 缺点:操作数有效地址仅由 A 决定,A 的位数受限于指令长度,导致寻址范围较小。
③ 隐含寻址(Implied Addressing)

- 操作:不显式地给出操作数地址,地址隐含在操作码或某个专用寄存器中。
- 典型例子:如某操作码为 ADD,必须要两个操作数。但指令只给出了一个操作数地址,另一个操作数默认隐含在累加器 ACC 中。
- 优点:有利于缩短指令字长(减少了一个地址码)。
④ 间接寻址(Indirect Addressing)


⑤ 寄存器寻址(Register Addressing)
-
操作:指令的地址码字段直接给出寄存器编号。

-
公式:EA = Ri,操作数就在寄存器 Ri 中。
-
优点:执行阶段无需访存,速度快;地址码位数少,缩短指令字长(即使计算机有 1024 个寄存器,只需 10 位即可表示)。
-
缺点:寄存器价格昂贵,个数有限。
⑥ 寄存器间接寻址(Register Indirect Addressing)

- 操作:寄存器 Ri 的内容不是操作数,而是操作数所在的主存单元地址号。
- 公式:EA = (Ri)。
- 访存次数:1 次(取指 1 次 + 取操作数 1 次,寄存器本身不需要访存)。
- 优点:便于编制循环程序。
- 缺点:需要访存一次去取操作数。
⑦ 基址寻址(Base Addressing)
-
操作:将 CPU 中的基址寄存器(BR)内容与指令中的形式地址 A 相加,形成有效地址。

-
公式:EA = A + (BR)。
-
分类:
- 隐式:计算机内设专用基址寄存器 BR,指令特征位反映。
- 显式:一组通用寄存器,由用户明确哪个寄存器用作基址。
-
特点(考研极容易考):
- 基址寄存器中存放当前程序的首地址。
- 在程序运行过程中,基址寄存器内容不变,而形式地址 A 作为偏移量可变。
- 基址内容由操作系统确定,程序过程中不能由用户随意改变。
-
优点:① 扩大操作数的寻址范围;② 解决多道程序问题(便于程序浮动/重定位,操作系统只需修改基址寄存器的内容,就能实现整段程序在内存中的浮动)。
⑧ 变址寻址(Index Addressing)

- 操作:有效地址 EA 是 指令中形式地址 A 与 变址寄存器 IX 的内容之和。
- 公式:EA = A + (IX)。
- 特点(与基址寻址形成极度重要的对比):
- 基址寻址:程序员操作偏移地址 A,基址寄存器内容由 OS 控制,BR 不变,A 变。
- 变址寻址:程序员操作变址寄存器 IX,偏移地址固定不变,IX 变,A 不变。
- 变址寄存器面向用户,用户程序可以修改其内容。
- 优点:① 扩大操作数寻址范围;② 适合处理数组问题和循环程序------把指令字中的形式地址 A 设置为数组的首地址,在循环中不断改变变址寄存器 IX 的内容。
- 易错考点:变址常与其他寻址混用,如:先变址再变址
EA=(A)+(IX)或 先变址再间址EA=(A+(IX))。
⑨ 相对寻址(Relative Addressing)

- 操作:有效地址是指令中形式地址 A 与程序计数器 PC 内容之和。
- 公式:EA = A + (PC)。
- 理论基础:基于程序的局部性原理。
- 特点:偏移量 A 可正可负(通常用补码表示)。
- 优点:① 专门用于转移类指令,便于编制浮动程序(程序正确运行不受程序所在的物理地址限制)。
💡 基址、变址、相对对比总结 :
这三种都可以看作是"偏移寻址",它们的访存次数均为 1 次。基址和变址的区别在于谁动谁不动;相对寻址依托 PC,用于跳转。
⑩ 堆栈寻址(Stack Addressing)
- 操作:操作数地址由堆栈指针 SP 指出,采用先进后出(FILO)原则。
- 分类:
- 硬堆栈:使用多个寄存器实现。
- 软堆栈:指定一段存储空间作为堆栈,由堆栈指针 SP 指出栈顶地址。
- 进栈与出栈(SP 指针修改规则,必考难点):
- SP 指针的修改与编址方式密切相关:
- 按字编址:进栈 (SP)-1 -> SP;出栈 (SP)+1 -> SP。
- 按字节编址(以存储字长 16 位为例,1 个字 = 2 个字节):进栈 (SP)-2 -> SP;出栈 (SP)+2 -> SP。
- SP 指针的修改与编址方式密切相关:
(四):核心知识对比总结
数据寻址解决的是:当前指令的操作数从哪里取? 下面是最重要的 10 种数据寻址方式终极对比表:
| 序号 | 寻址方式 | 形式地址 A 的含义 | 有效地址 EA 公式 | 操作数位置 | 执行阶段访存次数 | 典型用途 |
|---|---|---|---|---|---|---|
| ① | 立即寻址 | 就是操作数本身 | 无(操作数 = A) | 指令字中 | 0 次 | 给寄存器/内存赋初值 |
| ② | 直接寻址 | 操作数的内存地址 | EA = A | 内存 | 1 次 | 访问固定内存单元 |
| ③ | 隐含寻址 | 指令中不显式给出 | 隐含在 ACC 或操作码中 | 寄存器 | 0 次 | 缩短指令字长 |
| ④ | 间接寻址 | 存放 EA 的内存地址 | EA = (A) | 内存 | 2 次(一次间址) | 扩大寻址范围,子程序返回 |
| ⑤ | 寄存器寻址 | 寄存器编号 | EA = Ri | 寄存器 | 0 次 | 速度快,缩短指令字长 |
| ⑥ | 寄存器间接寻址 | 寄存器编号 | EA = (Ri) | 内存 | 1 次 | 循环程序中取数组元素 |
| ⑦ | 基址寻址 | 偏移量 | EA = A + (BR) | 内存 | 1 次 | 程序重定位(OS 管理 BR) |
| ⑧ | 变址寻址 | 数组首地址 | EA = A + (IX) | 内存 | 1 次 | 数组遍历(用户修改 IX) |
| ⑨ | 相对寻址 | 相对于 PC 的偏移量 | EA = A + (PC) | 内存 | 1 次 | 转移指令,位置无关代码 |
| ⑩ | 堆栈寻址 | 无地址码 | EA = (SP) | 栈顶 | 0~1 次 | 函数调用、中断现场保存 |

基址 vs 变址 vs 相对寻址
| 对比维度 | 基址寻址 | 变址寻址 | 相对寻址 |
|---|---|---|---|
| 公式 | EA = A + (BR) | EA = A + (IX) | EA = A + (PC) |
| 谁提供基地址 | 基址寄存器 BR | 指令中的形式地址 A | 程序计数器 PC |
| 谁提供偏移量 | 指令中的形式地址 A | 变址寄存器 IX | 指令中的形式地址 A |
| 谁可变 | A 可变,BR 不变 | IX 可变,A 不变 | A 可变,PC 自动变 |
| 谁控制 | 操作系统 | 用户程序 | 硬件自动 |
| 核心用途 | 程序重定位 | 数组遍历、循环 | 转移指令、浮动程序 |
重定位是指程序在运行时,可以被加载到内存的任意位置并正确执行,而无需修改程序本身的代码。
总结
本文从计算机组成原理的核心考点"指令系统"出发,沿着基本概念 → 指令格式 → 寻址方式 → 核心对比的主线逐层展开。关键复习要点包括:
- 操作码与地址码:操作码定义"干什么",地址码指出"操作数在哪以及结果放哪"。
- 五类指令:零地址到四地址,对应的访存次数是高频考点,必须熟记。
- 扩展操作码:利用"短操作码不能是长操作码的前缀"原则合理分配编码空间。
- 10 种寻址方式:立即、直接、间接、寄存器、寄存器间接、基址、变址、相对、堆栈------每种方式的 EA 公式和执行阶段访存次数是重中之重。
- 偏移寻址三大金刚------基址寻址(OS 控制 BR,用于程序重定位)、变址寻址(用户控制 IX,用于数组遍历)、相对寻址(PC 自动给出基地址,用于转移指令)。
建议读者反复练习寻址方式的访存次数计算,并借助文末的对比表格强化记忆。掌握这些内容,指令系统将不再是"玄学",而是你高分答卷上最稳定的得分点。

