Appearance
题目
下列寻址方式中,最适合按下标顺序访问一维数组元素的是( )。
错因
A
相对寻址:EA = (PC) + 偏移。专门用于指令跳转/分支(让分支目标随程序位置移动),与"数据数组访问"完全两个用途。把"相对"听成"按某个基准变化"就可能误选。
B
寄存器寻址:操作数直接放在寄存器中(EA 就是寄存器编号)。数组元素散布在主存里,不可能全装进寄存器;况且每访问一个元素就要换寄存器编号,本质上是死循环展开而不是"按下标遍历"。
C
直接寻址:EA = 指令中给的形式地址,地址固定不变。数组遍历需要"地址 + 下标 × 元素长度"动态变化,直接寻址无法在不修改指令的情况下让地址变化——只能为每个数组元素单独写一条指令。
总解析
变址寻址的定义:
把它套到"按下标顺序访问 a[0], a[1], a[2], …" 的场景:
| 角色 | 安排 |
|---|---|
| 形式地址 | 数组首地址(如 a 的基址)—— 编译期固定 |
| 变址寄存器 | 装"下标 × 元素大小"—— 运行时按 0、4、8、12……递增 |
每次循环只需修改变址寄存器的值(一条 ADD 或 INC),就能访问下一个元素。地址灵活、指令本身不需要重写——这正是变址寻址的设计初衷。
与其它三种对比:
| 寻址方式 | EA 公式 | 是否适合数组遍历 |
|---|---|---|
| 相对寻址 | ✗ 偏移基准是 PC,与数据无关 | |
| 寄存器寻址 | 操作数 = 寄存器内容 | ✗ 数据不在主存 |
| 直接寻址 | (固定) | ✗ 一条指令对应一个固定地址 |
| 变址寻址 | ✓ 基址固定 + 下标变化,正好对应数组 |
最终答案是 D(变址寻址)。
经典代码片段(伪汇编演示变址访问数组):
MOV R1, #0 ; R1 = 下标 i = 0
LOOP:
LOAD R2, a(R1) ; 取 a[i],EA = a + (R1)
ADD SUM, R2 ; 累加
ADD R1, #4 ; i ++(int 占 4 字节)
CMP R1, #LEN
JNE LOOPa(R1) 这种汇编记号就是变址寻址:a 是形式地址(数组基址),R1 是变址寄存器(下标 × 步长)。