Appearance
题目
下列关于 CPU 中的数据通路和控制器的叙述中,错误的是( )。
错因
B
任何 CPU 都要根据"当前指令的操作码"决定该发哪些控制信号——这一步必须由操作码译码器完成(不管是硬连线还是微程序,前端都得先把 OP 字段译开)。B 描述正确——题目找"错误的",不选 B。
C
单周期 CPU 每条指令都在 1 个时钟内走完,控制信号是组合逻辑直接由当前指令译码得出,不需要状态机。多周期 CPU 把指令切成多个步骤,控制器要按周期数推进、维护"现在走到第几步",自然要状态机/计数器,比单周期复杂。C 描述正确,不选 C。
D
流水线 CPU 多条指令并行在不同段——前一条指令还没写回,后一条已经在 ID 段读寄存器,数据相关(RAW/WAW/WAR)和控制相关(分支跳转后续指令何时取)就会爆发。这是流水线的基本课题,要靠转发、阻塞、分支预测等机制处理。D 描述正确,不选 D。
总解析
题目问"错误的"叙述,A 是错的。
A 错在哪里:
通用寄存器组和程序计数器是 CPU 里两类不同的寄存器:
| 类别 | 例子 | 用途 | 程序员怎么用 |
|---|---|---|---|
| 通用寄存器(GPR) | x0–x31(RISC-V)、R0–R31(ARM)、EAX 等(x86) | 保存运算操作数和中间结果 | 指令明确用编号引用 |
| 专用寄存器 | PC(程序计数器)、IR(指令寄存器)、PSW(程序状态字)、MAR、MDR | 控制取指流程、暂存机器状态 | 通常不能用普通运算指令直接读写 |
PC 的特殊性:
- 每个时钟周期自动 +指令长度(顺序执行)或被分支指令改写
- 由控制器内部时序逻辑直接管理,不需要程序员"显式 mov 给 PC"
- 在大多数 ISA 里,PC 没有寄存器编号,指令字段也没办法直接索引到它(少数例外如 ARM 的 R15 = PC,是历史遗留的特殊设计)
- PC 与通用寄存器组在物理上往往完全分开——通用寄存器组是一个多端口的 RegFile(典型 2 读 1 写),PC 是一个独立的更新逻辑(PC ← PC+4 或 PC ← 分支目标)
把 PC 塞进通用寄存器组,会破坏它的自动推进机制和保护语义——所以通用寄存器组不应、也不会包含 PC。
逐项核验:
| 选项 | 内容 | 对/错 | 理由 |
|---|---|---|---|
| A | 通用寄存器组中应该包含 PC | ✗ | PC 是专用寄存器,与通用寄存器组分开 |
| B | 控制器一定包含操作码译码电路 | ✓ | 不译码就无法发对应控制信号 |
| C | 单周期 CPU 控制器更简单 | ✓ | 单周期 = 组合逻辑,无状态机 |
| D | 流水线 CPU 需解决相关与冒险 | ✓ | 多指令并行,相关性必然出现 |
最终答案是 A。
寄存器分类速记:
| 寄存器 | 是否程序员可见 | 是否在通用寄存器组 |
|---|---|---|
| 通用寄存器 R0–Rn | 可见、可指定 | 是 |
| PC(程序计数器) | 通常不可直接读写 | 否 |
| IR(指令寄存器) | 不可见 | 否 |
| MAR / MDR | 不可见 | 否 |
| PSW / FLAGS | 部分位可见 | 否(独立) |
把 PC 当通用寄存器,等于让程序员"在做加法时顺手改变下一条要执行的指令"——这显然破坏了控制流的稳定性。考研考点里 PC 永远归在"专用寄存器"那一栏。