精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

寻址方式计算实战

考情分析

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 = 0050HMem[0050H] = 7000H
间接EA = Mem[0050H] = 7000HMem[7000H] = 9000H
寄存器(R1)R1 = 2000H
寄存器间接(R1)EA = 2000HMem[2000H] = 5000H
相对EA = 1001H + 0050H = 1051HMem[1051H] = 4000H
基址(BR=R1=2000H)EA = 2000H + 0050H = 2050HMem[2050H] = 8000H
变址(IX=R2=3000H)EA = 3000H + 0050H = 3050HMem[3050H] = 6000H

编者注(口径统一):相对寻址的基准永远是取指后的 PC,也就是"下一条指令的地址",绝不是本条指令的首地址。本文所有例题一律先写出 PC 再代入,不留"要看题目"这种模棱两可的余地。

PC=本条指令首地址+指令长度编址单位

分母那一项容易被忽略——按字编址且定长指令时加 1,按字节编址时加的是指令占的字节数。真题里"定长指令 + 按字节编址"这一档最常设陷阱:2 字节定长指令按字编址加 1、按字节编址加 2,两者差一个单位,直接决定选项对错。

例题二:间接寻址多层

已知:A = 100H,Mem[100H] = 200H,Mem[200H] = 300H,Mem[300H] = 42H

层数EA操作数
直接100HMem[100H] = 200H
一重间接Mem[100H] = 200HMem[200H] = 300H
二重间接Mem[200H] = 300HMem[300H] = 42H

每多一层间接,多访存 1 次。

例题三:复合寻址(基址 + 变址)

部分机器支持基址和变址叠加。x86 的通用形式带一个比例因子

EA=可选+×可选,因子{1,2,4,8}+立即数

比例因子 $= $ 数组元素的字节数——正是它让"下标 × 元素宽度"这一步由硬件顺手做掉。

已知:BR = 1000H,IX = 0100H,比例因子 = 1,位移 = 0020H

EA=1000H+0100H×1+0020H=1120H

操作数为 Mem[1120H]。

对上真题里的二维数组

真题给的形式长这样:mov [ecx + edx*4 + 00422000H], eax。三段各是什么,别记反

位置真题里通常放什么
位移00422000H数组首地址——它是编译期常量,所以放在指令的立即数字段
基址寄存器(ecx行偏移,即 i× 行宽(行宽 = 列数 × 元素字节数)
变址寄存器 × 比例因子(edx*4列偏移,即 j× 元素字节数

对应的地址公式:

addr(a[i][j])=+i××+j××

编者注(易错)首地址在位移里,不在基址寄存器里。看到 [ecx+edx*4+00422000H] 就反推:edx*4 里的 4 说明元素是 4 字节;若数组是 a[64][64] 的 int,行宽 =64×4=256,那么 ecx 装的就是 i×256。这一步是反推寄存器含义的标准动作。

例题四:先变址后间接 vs 先间接后变址

两种顺序结果不同:

先变址后间接

EA=Mem[(IX)+A]
  1. 先计算 IX+A(变址),得到一个中间地址
  2. 再对该地址间接寻址,取出最终有效地址

先间接后变址

EA=Mem[A]+IX
  1. 先从地址 A 间接取出基地址
  2. 再加上 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 已加本条指令长度):

PC=00401025H+5=0040102AH偏移量=目标PC=00401000H0040102AH=2AH

写成 32 位补码:2AH=FFFFFFD6H。小端机器中这 4 字节在机器码里按低字节在前排列,整条指令为 E8 D6 FF FF FF

反向验算(题目也可能反过来给机器码求目标):目标 = 0040102AH+FFFFFFD6H=00401000H(按 32 位截断)✓

两个采分点:基准是"加完指令长度之后"的 PC,x86 变长指令加的是本条指令字节数(这里是 5),不是 1;负偏移要写成补码再按字节序放进机器码。

取操作数完整流程

指令中的地址字段 A
    ↓(根据寻址特征)
计算有效地址 EA(可能经过多次变换)

访问存储器或寄存器

得到操作数

关键点:操作数可能在指令中(立即)、寄存器中(寄存器寻址)或存储器中(其余方式)。

考点清单

  • 先算 EA,再从 EA 取操作数(分两步,别混淆)
  • 相对寻址:EA = PC + A,PC 是取指后的值(已自动加 1 或加指令字节数)
  • 间接寻址每多一重多访存 1 次
  • 基址由 OS 设置(不可随意修改),变址由程序员控制(循环中递增)
  • 复合寻址:基址 + 变址 + 偏移,常用于二维数组访问
  • 先变址后间接 ≠ 先间接后变址,注意顺序

真题练习