Appearance
题目
某指令格式如下所示。
| OP | M | I | D |
|---|
其中 M 为寻址方式,I 为变址寄存器编号,D 为形式地址。若采用先变址后间址的寻址方式,则操作数的有效地址是( )。
错因
A
把 I(寄存器编号)当成寄存器内容用了。指令字段里的 I 只是"编号"——是寄存器的名字,比如"R3"。要拿到 R3 里存的值得加一层括号 (I),表示"取该编号寄存器中的内容"。直接 I+D 既没做"取寄存器内容"也没做"间址查内存"。
B
只完成了变址这一步: 是变址结果,本身就是一个内存地址。但题目要求"先变址后间址"——还要把这个地址当成指针,到内存里再取一次得到最终的有效地址。漏了"再加一层括号"。
D
变址写错了位置:把 D 留在了括号外,变成"先对 I 做两次解引用,再加 D"。正确顺序是:变址(拿寄存器内容加形式地址)→ 间址(再去内存里取)。((I))+D 既不是变址也不是间址,不是任何合法的标准寻址方式。
总解析
记号约定(408 真题约定俗成):
| 记号 | 含义 |
|---|---|
I | 变址寄存器编号 |
(I) | 变址寄存器中存的内容(一个地址值) |
D | 指令中给的形式地址(常数) |
(X) | 把 X 当作内存地址,取该地址处存的内容 |
第一步:先变址
变址寻址:操作数地址 ,即把变址寄存器的内容加上形式地址。
记 ,这是变址结果,本身是一个内存地址。
第二步:后间址
间接寻址:把上一步得到的地址 当作指针,到内存里取出真正的有效地址:
最终答案是 C(((I)+D))。
寻址过程示意:
寄存器 I (编号) 内存
┌────┐ ┌──────────────┐
│(I) │ ──┐ │ │
└────┘ │ +D │ │
▼ │ │
(I) + D ────▶ │ 存的是 EA │ ◀── 间址再取一次
│ │
└──────────────┘
│
▼
最终 EA = ((I) + D)易错点速查:
| 错误 | 实质 |
|---|---|
写成 I + D | 把寄存器编号当成内容(少了一层括号) |
写成 (I) + D | 只做了变址,没做间址 |
写成 ((I)) + D | 变址和间址的"地址组成方式"搞错位 |
通用规律:每多一层"间址"就多套一层括号,括号位置始终是"对前面整个表达式取址"。