Appearance
题目
某指令功能为 R[r2] ← R[r1] + M[R[r0]],其两个源操作数分别采用寄存器、寄存器间接寻址方式。对于下列给定部件,该指令在取数及执行过程中需要用到的是( )。
Ⅰ. 通用寄存器组(GPRs) Ⅱ. 算术逻辑单元(ALU) Ⅲ. 存储器(Memory) Ⅳ. 指令译码器(ID)
错因
A
漏选 Ⅲ(存储器)。可能没注意到 M[R[r0]] 中的 M[] 表示访存——一旦看到方括号 M[] 就要立即想到"要访问存储器"。寄存器间接寻址的"间接"二字也是访存的提示。
C
漏选 Ⅰ(通用寄存器组)。题面明示三个寄存器编号 r0, r1, r2——必然要从 GPRs 里读取 r1、r0 内容,并把结果写回 r2,缺一不可。如果不用 GPRs,这些 r 编号无从兑现。
D
漏选 Ⅱ(ALU)但多选 Ⅳ(指令译码器)。两个错叠加:
- 漏 ALU:
+号是加法运算,必须经过 ALU - 多 ID:题问"取数及执行"——译码已经在更早的"译码段"完成,到了取数/执行阶段不再需要 ID
总解析
第一步:拆分指令的数据流
R[r2] ← R[r1] + M[R[r0]] 完整动作:
| 步骤 | 用到的部件 |
|---|---|
| ① 读 r1 寄存器内容 | GPRs(Ⅰ) |
| ② 读 r0 寄存器内容 | GPRs(Ⅰ) |
| ③ 用 r0 的内容做地址,到主存取 M[R[r0]] | Memory(Ⅲ) |
| ④ R[r1] + M[R[r0]] 相加 | ALU(Ⅱ) |
| ⑤ 结果写回 r2 寄存器 | GPRs(Ⅰ) |
用到的部件:Ⅰ + Ⅱ + Ⅲ。
第二步:判断 Ⅳ(指令译码器)是否需要
指令在 CPU 中走过的几个阶段:
| 阶段 | 任务 | 关键部件 |
|---|---|---|
| 取指(IF) | 从内存取指令 → IR | PC、Memory、IR |
| 译码(ID) | 解析操作码、寄存器号、寻址方式 | 指令译码器 ID |
| 取数(EX 前段) | 从寄存器/内存读操作数 | GPRs、Memory |
| 执行(EX) | ALU 运算 | ALU |
| 访存(MEM) | 读/写存储器 | Memory |
| 写回(WB) | 结果写回寄存器 | GPRs |
题面明确问"取数及执行过程"——这两个阶段在 ID 之后,译码工作已完成,得到的"控制信号 + 寄存器号 + 寻址方式"已经送到数据通路;ID 部件本身在后续阶段不再使用。
所以 Ⅳ 不在答案里。
第三步:汇总
需要的部件 = Ⅰ + Ⅱ + Ⅲ。
最终答案是 B(仅 I、II、III)。
速查表——按指令阶段对应部件:
| 阶段 | 必用部件 | 本题用了? |
|---|---|---|
| IF(取指) | PC、Memory、IR | 取指阶段,题问"取数及执行",不算 |
| ID(译码) | 指令译码器 | 译码阶段,题问"取数及执行",不算 |
| 取数 | GPRs、Memory | ✓(Ⅰ、Ⅲ) |
| 执行 | ALU | ✓(Ⅱ) |
| 访存 | Memory | 已在"取数"用过 |
| 写回 | GPRs | 已在 GPRs 范畴 |
易错点速查:
- 看到
M[]立即想到"用 Memory" - 看到
+、−、AND、OR等运算符立即想到"用 ALU" - 看到
R[]立即想到"用 GPRs" - 题问的"取数及执行" 不包括"译码"——ID 部件已在更早阶段完成工作