Appearance
寻址方式计算实战
考情分析
寻址计算题常以选择题+填空题的形式出现,给定寄存器/内存值,求有效地址或最终操作数。复合寻址(基址+变址、先变址后间接等)是大题中的难点。
基础计算:EA 公式速查
| 寻址方式 | EA 或操作数来源 |
|---|---|
| 立即 | 操作数 = A(指令中的数值) |
| 直接 | EA = A |
| 间接 | EA = Mem[A] |
| 寄存器 | 操作数 = Ri |
| 寄存器间接 | EA = Ri |
| 相对 | EA = PC + A |
| 基址 | EA = BR + A |
| 变址 | EA = IX + A |
例题一:单一寻址方式
已知:PC = 1000H,R1 = 2000H,R2 = 3000H,A(指令地址字段) = 0050H 内存:Mem[1050H] = 4000H,Mem[2000H] = 5000H,Mem[3050H] = 6000H
| 寻址方式 | EA 计算 | 操作数 |
|---|---|---|
| 立即 | — | 0050H |
| 直接 | EA = 0050H | Mem[0050H] |
| 间接 | EA = Mem[0050H] | Mem[Mem[0050H]] |
| 寄存器(R1) | — | R1 = 2000H |
| 寄存器间接(R1) | EA = 2000H | Mem[2000H] = 5000H |
| 相对 | EA = 1000H + 0050H = 1050H | Mem[1050H] = 4000H |
| 基址(BR=R1=2000H) | EA = 2000H + 0050H = 2050H | Mem[2050H] |
| 变址(IX=R2=3000H) | EA = 3000H + 0050H = 3050H | Mem[3050H] = 6000H |
注意:相对寻址 PC 已自动加 1(指向下一条),实际题目中要看 PC 是否已更新。
例题二:间接寻址多层
已知:A = 100H,Mem[100H] = 200H,Mem[200H] = 300H,Mem[300H] = 42H
| 层数 | EA | 操作数 |
|---|---|---|
| 直接 | 100H | Mem[100H] = 200H |
| 一重间接 | Mem[100H] = 200H | Mem[200H] = 300H |
| 二重间接 | Mem[200H] = 300H | Mem[300H] = 42H |
每多一层间接,多访存 1 次。
例题三:复合寻址(基址 + 变址)
部分机器支持基址和变址叠加:
已知:BR = 1000H,IX = 0100H,A = 0020H
操作数为 Mem[1120H]。
这种方式在访问二维数组时很有用:BR 指向数组起始,IX 是行偏移,A 是列偏移。
例题四:先变址后间接 vs 先间接后变址
两种顺序结果不同:
先变址后间接(Pre-Indexed Indirect):
- 先计算
(变址),得到一个中间地址 - 再对该地址间接寻址,取出最终有效地址
先间接后变址(Post-Indexed Indirect):
- 先从地址
间接取出基地址 - 再加上 IX 偏移(变址)得到最终有效地址
例:IX = 0004H,A = 200H,Mem[200H] = 1000H,Mem[204H] = 2000H
先间接后变址:EA = Mem[200H] + 4 = 1000H + 4 = 1004H
先变址后间接:EA = Mem[200H + 4] = Mem[204H] = 2000H
两种结果完全不同,在实际语言中对应 C 的 *(p + i) 和 *(p) + i 的区别。
例题五:真题风格综合题
题:16 位机,指令格式如下:
[4位操作码 | 2位寻址特征 | 10位地址/立即数 A]寻址特征:00=立即,01=直接,10=寄存器间接(A 为寄存器编号),11=相对
设当前 PC = 1000H(取出本条指令后已自动 +1 指向 1001H), R3 = 0500H,A = 0100H,Mem[0100H] = 0200H。
各寻址方式下的操作数:
| 寻址特征 | 方式 | 操作数 |
|---|---|---|
| 00 | 立即 | 0100H |
| 01 | 直接 | Mem[0100H] = 0200H |
| 10 | 寄存器间接(R3) | Mem[R3] = Mem[0500H] |
| 11 | 相对 | Mem[PC + A] = Mem[1001H + 0100H] = Mem[1101H] |
取操作数完整流程
指令中的地址字段 A
↓(根据寻址特征)
计算有效地址 EA(可能经过多次变换)
↓
访问存储器或寄存器
↓
得到操作数关键点:操作数可能在指令中(立即)、寄存器中(寄存器寻址)或存储器中(其余方式)。
考点清单
- 先算 EA,再从 EA 取操作数(分两步,别混淆)
- 相对寻址:EA = PC + A,PC 是取指后的值(已自动加 1 或加指令字节数)
- 间接寻址每多一重多访存 1 次
- 基址由 OS 设置(不可随意修改),变址由程序员控制(循环中递增)
- 复合寻址:基址 + 变址 + 偏移,常用于二维数组访问
- 先变址后间接 ≠ 先间接后变址,注意顺序