Appearance
数据寻址方式
考情分析
寻址方式是每年 408 必考知识点,选择题和大题均有涉及。重点在于 EA 的计算公式和访存次数,尤其是间接寻址、基址/变址寻址的区别。
寻址方式总览
| 寻址方式 | 有效地址 EA | 取操作数访存次数 | 特点 |
|---|---|---|---|
| 立即寻址 | 操作数就是指令中的数本身 | 0 | 最快,操作数在指令中 |
| 直接寻址 | EA = A | 1 | 简单,A 是内存地址 |
| 间接寻址 | EA = (A) | 2(一次取地址,一次取数) | 灵活,支持数组/指针 |
| 寄存器寻址 | 操作数在寄存器中 | 0(不访存) | 最快访问,寄存器有限 |
| 寄存器间接寻址 | EA = (R) | 1 | 寄存器存地址,灵活 |
| 相对寻址 | EA = (PC) + A | 1 | 与位置无关,适合跳转 |
| 基址寻址 | EA = (B) + A | 1 | B 由操作系统设置,程序重定位 |
| 变址寻址 | EA = (X) + A | 1 | X 由程序员修改,适合循环/数组 |
注:A 是指令中的地址字段,(X) 表示寄存器 X 的内容。
各寻址方式详解
立即寻址
指令中直接包含操作数,而不是操作数的地址。
指令: ADD R0, #5 ; 将立即数 5 加到 R0操作数 = 指令中的立即数字段,无需访存取操作数。但立即数的位宽受指令字长限制。
直接寻址
指令中的地址字段
访存 1 次即可取到操作数。地址空间受
间接寻址
指令中的
需要访存 2 次:第 1 次从地址
多重间接寻址:
寄存器寻址
操作数在某个寄存器中,指令指定寄存器编号。
不访存,速度最快。但寄存器数量有限(一般 8~32 个)。
寄存器间接寻址
寄存器中存的是操作数的内存地址。
访存 1 次取操作数(地址在寄存器中,比直接寻址少一次主存地址读取)。
相对寻址
以程序计数器 PC 的当前值为基准,加上偏移量
注意:取该指令时 PC 已自动加 1(指向下一条),所以 EA = 下一条指令地址 + A。
特点:指令中存储的是相对偏移而非绝对地址,程序可以加载到任意内存位置而不改变相对跳转(位置无关代码)。条件跳转指令广泛使用。
基址寻址
以基址寄存器 B(Base Register)的内容为基准,加上偏移量
- 基址寄存器由操作系统设置,用于程序重定位(多道程序)
- 偏移量
较小,基址寄存器覆盖程序起始地址 - 程序中的
是相对程序起始的偏移,基址 是实际起始地址
变址寻址
以变址寄存器 X(Index Register)的内容为基准,加上固定偏移量
- 变址寄存器由程序员控制,可以在循环中自动增减
是数组/表格的起始地址(固定), 是下标(变化的) - 适合遍历数组、查表等顺序访问
基址与变址的区别
| 特性 | 基址寻址 | 变址寻址 |
|---|---|---|
| 哪个变化 | A 固定,B 由 OS 设置 | A 固定,X 由程序员修改 |
| 用途 | 程序重定位 | 数组遍历、循环 |
| 修改者 | 操作系统 | 程序员 |
堆栈寻址
操作数隐含在栈顶,通过栈指针 SP 访问。
- PUSH X:SP-1 → SP,然后将 X 写入 M[SP](先移指针再压栈,或反之取决于架构)
- POP X:将 M[SP] 读出送 X,然后 SP+1 → SP
堆栈操作的操作数地址由 SP 隐含给出,无需在指令中显式指定。零地址指令(如 ADD)就是基于堆栈寻址:从栈顶弹出两个操作数运算后结果压回栈顶。
交互可视化
访存次数汇总
| 寻址方式 | 取指令访存 | 取操作数访存 | 总计 |
|---|---|---|---|
| 立即 | 1 | 0 | 1 |
| 寄存器 | 1 | 0 | 1 |
| 直接 | 1 | 1 | 2 |
| 寄存器间接 | 1 | 1 | 2 |
| 相对 | 1 | 1 | 2 |
| 基址 | 1 | 1 | 2 |
| 变址 | 1 | 1 | 2 |
| 间接 | 1 | 2 | 3 |
考点清单
- 立即寻址:操作数在指令中,访存 0 次取操作数
- 间接寻址:访存 2 次(取地址 + 取数据),比直接多 1 次
- 基址寻址:OS 设置基址,用于重定位;变址寻址:程序员设置,用于遍历
- 相对寻址:EA = PC + 偏移,PC 已指向下一条指令
- 寄存器间接 EA = (Ri),只访存 1 次(地址已在寄存器中)