首页/计算机组成原理/指令系统/寻址方式 🔗 在 Obsidian 中打开
计算机组成原理 · 指令系统

寻址方式

难度 ★★★重要度 ★★★★★ 考查频率 低题型 选择 / 简答 立即寻址直接寻址间接寻址基址变址
速查
寻址方式决定操作数的来源有效地址 EA 的计算方法:立即(EA 无,操作数在指令中)、直接(EA = A)、间接(EA = M[A])、寄存器(操作数在 Rn)、偏移类(EA = 寄存器 + A)。

概述

寻址方式是指令获取操作数的方式,决定了操作数的来源(指令中 / 寄存器中 / 内存中)和地址的计算方法。不同的寻址方式在灵活性执行效率代码密度之间权衡。

寻址方式总体上分为两大类:指令寻址(下一条指令在哪)与数据寻址(本条指令的操作数在哪)。

寻址方式 指令寻址顺序 / 跳跃 数据寻址方式立即 / 直接 / 间接 / 寄存器 / 偏移 / 相对 / 堆栈
图:寻址方式的两大分支——指令如何取、数据从哪来。

指令寻址

顺序寻址

程序计数器 PC 自动加上本条指令的长度,指向下一条指令:

PC ← PC + 指令长度
按顺序执行下一条指令

跳跃寻址

通过转移指令改变 PC,使执行流跳转到目标地址:

PC ← 目标地址
包括:
- 无条件跳转(JMP)
- 条件跳转(BEQ, BNE 等)
- 调用(CALL)与返回(RET)

数据寻址方式

立即寻址(Immediate)

操作数直接包含在指令中,无需访问内存。

OP  #立即数
MOV  R1, #100     → R1 ← 100
ADD  R1, R2, #5   → R1 ← R2 + 5
特点速度最快(无需访存);但操作数固定、灵活性低,常用于常数初始化。

直接寻址(Direct)

指令中的地址码 就是操作数的内存地址:

OP  A            (EA = A)
MOV  R1, [1000]  → R1 ← M[1000]
ADD  R1, [2000]  → R1 ← R1 + M[2000]
特点简单直接;但地址码位数限制了可寻址范围(如 16 位地址码 → 最多 64K)。

间接寻址(Indirect)

地址码指向的单元中存放的是有效地址

OP  [A]          (EA = M[A])
MOV  R1, [[1000]]
假设 M[1000]=2000, M[2000]=999
→ R1 ← M[M[1000]] = M[2000] = 999
注意可寻址整个地址空间、灵活性高,但需要两次访存(取 EA + 取操作数),速度慢。

寄存器寻址(Register)

操作数在寄存器中,速度最快:

OP  R1
ADD  R1, R2, R3   → R1 ← R2 + R3
MOV  R1, R2       → R1 ← R2
特点无需访存、速度最快;但寄存器数量有限(通常 32 个),是最常用的寻址方式。

寄存器间接寻址(Register Indirect)

寄存器中是有效地址,操作数在内存中:

OP  [R1]         (EA = (R1))
MOV  R1, [R2]  → R1 ← M[R2]
若 R2=1000,则 R1 ← M[1000]
特点兼顾寄存器速度与内存灵活性,常用于数组访问、指针解引用。

偏移寻址

基址寻址:有效地址 = 基址寄存器 + 形式地址,基址寄存器由操作系统设置,用于程序重定位。

EA = (BR) + A
MOV  R1, [BR+100]
若 BR=1000,则 R1 ← M[1100]

变址寻址:有效地址 = 变址寄存器 + 形式地址,变址寄存器由用户修改,常用于数组遍历。

EA = (IX) + A
MOV  R1, [A+IX]
若 A=1000, IX=50,则 R1 ← M[1050]
基址 vs 变址基址寻址中"基地址不变、偏移可变"(OS 掌控);变址寻址中"形式地址不变、变址寄存器可变"(用户掌控)。两者还可叠加:EA = (BR) + (IX) + A,用于二维数组访问。

相对寻址(PC-Relative)

有效地址 = PC + 形式地址,且 PC 已更新为下一条指令的地址:

EA = PC + A
BEQ  R1, R2, offset
若 R1=R2,则跳转到 PC + offset
优势与位置无关(PIC),程序可加载到任意地址;但偏移量位数限制了跳转范围。

堆栈寻址(Stack)

操作数隐含在栈顶,由栈指针 SP 指示:

PUSH:SP ← SP-1,  M[SP] ← 数据
POP :数据 ← M[SP],  SP ← SP+1
用途表达式求值、函数调用、中断处理。

寻址方式对比

总览访存次数是考查重点:立即 / 寄存器为 0 次,间接为 2 次,其余多为 1 次。
寻址方式有效地址 EA访存次数速度灵活性
立即无(操作数在指令中)0最快
直接$EA = A$1
间接$EA = M[A]$2
寄存器无(操作数在 Rn)0最快
寄存器间接$EA = (R)$1较快
基址$EA = (BR)+A$1较快
变址$EA = (IX)+A$1较快
相对$EA = (PC)+A$1较快
堆栈$EA = (SP)$1较快

MIPS 与 x86 寻址

MIPS 寻址方式

1. 立即寻址:addi $t0, $t1, 100
2. 寄存器寻址:add  $t0, $t1, $t2
3. 基址寻址:lw   $t0, 100($t1)  → $t0 ← M[$t1+100]
4. PC 相对寻址:beq $t0, $t1, offset
5. 伪直接寻址:j target(跳转地址 = PC高4位 | target<<2)

x86 寻址方式

1. 立即寻址:MOV EAX, 100
2. 寄存器寻址:MOV EAX, EBX
3. 直接寻址:MOV EAX, [0x1000]
4. 寄存器间接:MOV EAX, [EBX]
5. 基址寻址:MOV EAX, [EBX+100]
6. 变址寻址:MOV EAX, [ESI*4+100]
7. 基址+变址:MOV EAX, [EBX+ESI*4+100]

易错点

必记
  1. 间接寻址需两次访存,直接寻址只需一次
  2. 基址寻址的基址寄存器由 OS 设置,变址寄存器由 用户修改
  3. 相对寻址的偏移量相对于 PC(下一条指令地址),不是当前指令。
  4. 立即寻址的操作数不占用内存地址
  5. 寄存器寻址和立即寻址都不需要访存(0 次)
  6. 基址 + 变址可访问二维数组;堆栈寻址的操作数隐含在栈顶

记忆卡片

间接 vs 直接访存次数?
直接 1 次,间接 2 次。
基址寄存器谁来设?
OS 设置;变址寄存器由用户改。
相对寻址的基准?
PC(下一条指令地址),与位置无关。
哪些方式 0 次访存?
立即、寄存器寻址。

交互动画 · 有效地址 EA 计算

形式地址 A指令中的地址码 寄存器 RnBR / IX / PC / SP + 有效地址 EA操作数地址 主存 M[EA]取出操作数
选择一种寻址方式,查看有效地址 EA 的计算路径
点击上方按钮开始
示意图:形式地址 A 与寄存器 Rn 经 ALU 相加得到有效地址 EA,再访问主存取操作数;橙色流动虚线表示当前激活的计算路径。

相关知识点

instruction-format cisc-and-risc

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。