指令寻址方式详解
指令寻址方式详解:从顺序执行到跳跃控制
一、什么是指令寻址?
在 CPU 执行程序的过程中,必须知道下一条指令在哪儿,这就涉及到“指令寻址”问题。
📌 关键概念:
程序计数器(PC,Program Counter):一个专门用来记录下一条将要执行的指令地址的寄存器。指令寻址:就是 CPU 确定下一条指令存放位置的方式。
二、基本机制:PC 自动“加一”
✅ 默认情况
当 CPU 正常执行程序时,每执行完一条指令,PC 自动“加一”,指向下一条指令。
这种方式称为 顺序寻址(Sequential Addressing)就像在读书:读完一行自然看下一行。
示例:
假设指令存储在内存地址:
地址: 0 1 2 3 ...
内容: 指令1 指令2 指令3 ...
PC 初始为 0:
取出指令1,执行PC 自动 +1 → 指向 1取出指令2,执行PC 再 +1 → 指向 2
…
三、为什么加的是“1”?理解双引号的“1”
在课程讲义中经常说:“取完一条指令之后 PC 加 1”,但这个 “1” 打了双引号。为什么?
原因是:“1” 实际上不是固定的数值,它依赖于以下两个系统参数:
条件加多少?原因说明主存按字编址每条指令占1个字PC 加 1 就能指向下一条指令主存按字节编址每条指令占2字节PC 加 2 才能跳过当前指令变长指令字结构指令长短不定PC 加 当前指令的字节数
四、顺序寻址的三种场景
1️⃣ 定长 + 按字编址(最简单)
每条指令固定 1 个存储字主存地址每次只需 +1
🧪 例子:PC=0,执行完后变为1 → 指向下一条
2️⃣ 定长 + 按字节编址
每条指令占 2 字节主存按字节计地址 → 必须 PC 加 2
🧪 例子:
地址 内容
0~1 指令1
2~3 指令2
PC=0,执行完指令1后 → PC=2 → 正确跳过两个字节
3️⃣ 变长指令 + 按字节编址
不同指令长度不一CPU 需 先取第一字节,解析出该指令总长度 → 然后 PC += 长度
🧪 例子:
地址 指令(长度) 实际占字节数
0 LOAD A,B 4字节
4 ADD A,C 3字节
CPU:
先取地址0的首字节,判断该指令长度为4 → PC 加 4然后执行地址4的指令
五、跳跃寻址(Jump Addressing)
有些情况,我们不希望顺序执行下一条,而是跳到另一个地方继续执行,怎么办?
✅ 这就是跳跃寻址的应用场景!
跳跃寻址依赖于 转移类指令,例如:
JMP addr:跳转到指定地址CALL func:函数调用RET:函数返回
🧠 示例:无条件跳转指令 JMP 7
设当前程序片段如下:
地址指令0LOAD A1ADD B2JMP 73SUB C7STORE A执行流程:
PC=0,执行 LOAD A → PC++PC=1,执行 ADD B → PC++PC=2,执行 JMP 7 → 直接改写 PC = 7PC=7,执行 STORE A
📌 注意:执行 JMP 指令时,PC 的自动加一被“覆盖”,转而由跳转地址决定。
六、统一总结:两种指令寻址方式对比
分类顺序寻址跳跃寻址是否依赖 PC 自增是(自动加)否(跳转时由指令改写)执行流程线性,逐条执行非线性,允许跳跃到任意位置例子LOAD, ADD, STOREJMP, CALL, RET适用场景大多数普通指令控制流程转移、循环、函数调用
七、课程重点提醒:“加一”≠真的是加1
在学习过程中,我们常说“执行完指令后 PC 加一”,但你应该牢记:
加的是 “当前指令长度”(可能是1、2、3、4字节)还取决于 主存的编址单位(按字 or 字节)
这个“加一”,是带双引号的“一”。