Appearance
寻址方式计算实战
考情分析
408 的题型只有单项选择题和综合应用题两类。寻址计算主要以选择题出现:给定寄存器/内存值,求有效地址或最终操作数;也会作为综合应用题里的一环(指令译码后算 EA 再访存)。复合寻址(基址+变址、先变址后间接等)是最容易算错的一类。
大纲定位
考纲第四章(三):寻址方式——本篇是计算实战篇。
真题在这一条上的问法基本固定:给指令格式和寄存器/内存初值,逐种方式算 EA 和操作数;或给一条转移指令,反求偏移量、算转移范围。
基础计算:EA 公式速查
| 寻址方式 | EA 或操作数来源 |
|---|---|
| 立即 | 操作数 = A(指令中的数值) |
| 直接 | EA = A |
| 间接 | EA = Mem[A] |
| 寄存器 | 操作数 = Ri |
| 寄存器间接 | EA = Ri |
| 相对 | EA = PC + A |
| 基址 | EA = BR + A |
| 变址 | EA = IX + A |
交互可视化
输入任意 PC/寄存器/形式地址组合,逐种寻址方式核对 EA——先自己手算下面的例题,再用它对答案。
例题一:单一寻址方式
已知:本条指令首地址 = 1000H,指令长度 1 个编址单位(故取指后 PC = 1001H),R1 = 2000H,R2 = 3000H,A(指令地址字段) = 0050H
内存:Mem[0050H] = 7000H,Mem[1051H] = 4000H,Mem[2000H] = 5000H,Mem[2050H] = 8000H,Mem[3050H] = 6000H,Mem[7000H] = 9000H
| 寻址方式 | EA 计算 | 操作数 |
|---|---|---|
| 立即 | — | 0050H |
| 直接 | EA = 0050H | Mem[0050H] = 7000H |
| 间接 | EA = Mem[0050H] = 7000H | Mem[7000H] = 9000H |
| 寄存器(R1) | — | R1 = 2000H |
| 寄存器间接(R1) | EA = 2000H | Mem[2000H] = 5000H |
| 相对 | EA = 1001H + 0050H = 1051H | Mem[1051H] = 4000H |
| 基址(BR=R1=2000H) | EA = 2000H + 0050H = 2050H | Mem[2050H] = 8000H |
| 变址(IX=R2=3000H) | EA = 3000H + 0050H = 3050H | Mem[3050H] = 6000H |
编者注(口径统一):相对寻址的基准永远是取指后的 PC,也就是"下一条指令的地址",绝不是本条指令的首地址。本文所有例题一律先写出
再代入,不留"要看题目"这种模棱两可的余地。 分母那一项容易被忽略——按字编址且定长指令时加 1,按字节编址时加的是指令占的字节数。真题里"定长指令 + 按字节编址"这一档最常设陷阱:2 字节定长指令按字编址加 1、按字节编址加 2,两者差一个单位,直接决定选项对错。
例题二:间接寻址多层
已知: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 次。
例题三:复合寻址(基址 + 变址)
部分机器支持基址和变址叠加。x86 的通用形式带一个比例因子:
比例因子 $= $ 数组元素的字节数——正是它让"下标
已知:BR = 1000H,IX = 0100H,比例因子 = 1,位移 = 0020H
操作数为 Mem[1120H]。
对上真题里的二维数组
真题给的形式长这样:mov [ecx + edx*4 + 00422000H], eax。三段各是什么,别记反:
| 位置 | 真题里通常放什么 |
|---|---|
位移(00422000H) | 数组首地址——它是编译期常量,所以放在指令的立即数字段 |
基址寄存器(ecx) | 行偏移,即 |
变址寄存器 edx*4) | 列偏移,即 |
对应的地址公式:
编者注(易错):首地址在位移里,不在基址寄存器里。看到
[ecx+edx*4+00422000H]就反推:edx*4里的 4 说明元素是 4 字节;若数组是a[64][64]的 int,行宽,那么 ecx装的就是。这一步是反推寄存器含义的标准动作。
例题四:先变址后间接 vs 先间接后变址
两种顺序结果不同:
先变址后间接:
- 先计算
(变址),得到一个中间地址 - 再对该地址间接寻址,取出最终有效地址
先间接后变址:
- 先从地址
间接取出基地址 - 再加上 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] |
例题六:相对寻址反求偏移量(机器级真题问法)
正向求 EA 只是基本功,统考综合题更爱反着问:给目标地址求机器码里的偏移字段。这正是 2019 年第 45 题第 (3) 问的设问。
题:x86 机器按字节编址。某 call 指令位于虚拟地址 00401025H,机器码共 5 字节(1 字节操作码 E8 + 4 字节偏移量),调用的子程序入口为 00401000H。求机器码中的偏移量字段。
解:相对寻址的基准是下一条指令的地址(取指后 PC 已加本条指令长度):
写成 32 位补码:E8 D6 FF FF FF。
反向验算(题目也可能反过来给机器码求目标):目标 =
两个采分点:基准是"加完指令长度之后"的 PC,x86 变长指令加的是本条指令字节数(这里是 5),不是 1;负偏移要写成补码再按字节序放进机器码。
取操作数完整流程
指令中的地址字段 A
↓(根据寻址特征)
计算有效地址 EA(可能经过多次变换)
↓
访问存储器或寄存器
↓
得到操作数关键点:操作数可能在指令中(立即)、寄存器中(寄存器寻址)或存储器中(其余方式)。
考点清单
- 先算 EA,再从 EA 取操作数(分两步,别混淆)
- 相对寻址:EA = PC + A,PC 是取指后的值(已自动加 1 或加指令字节数)
- 间接寻址每多一重多访存 1 次
- 基址由 OS 设置(不可随意修改),变址由程序员控制(循环中递增)
- 复合寻址:基址 + 变址 + 偏移,常用于二维数组访问
- 先变址后间接 ≠ 先间接后变址,注意顺序