Skip to content

2009年 408 计算机组成原理 第 11 题

计算机组成原理2009年选择题2分

题目

冯·诺依曼计算机中指令和数据均以二进制存放,CPU 区分它们的依据是( )。

错因

A

把"译码"提到了"区分"之前——因果倒置。操作码译码发生在指令已经被取入 IR(指令寄存器)之后,CPU 已经默认这段位串就是指令、才会送进译码器。问题在于:是什么决定了这段位串"是指令而非数据"?答案是 CPU 当前处于取指阶段——这一步发生在译码之前。译码只能解释"是哪条指令",不能用来区分"是不是指令"。

B

把"寻址方式"当成"区分指令/数据的标记位"。寻址方式是指令字段的一部分(操作码旁的几位),CPU 在已经把这段位串识别为指令、并解析其中操作数地址时才用到。和 A 同类错误:寻址方式服务于"已识别的指令内部",不在"是不是指令"这一层。指令和数据本身没有寻址方式这个属性——它是指令格式里的字段。

D

恰好和冯·诺依曼原理完全相反。冯·诺依曼计算机的核心特征就是"指令和数据统一编码、统一存放在同一存储器里"——存储单元自身不带"我是指令" / "我是数据"标签。同一个 0x12345678 字节,既可以被解释为加法指令、也可以被解释为整数 305419896,全看 CPU 用哪个周期访问它。如果靠存储单元来区分,那是哈佛架构(指令存储器和数据存储器物理分开)的做法,不是冯·诺依曼。

总解析

核心思路:冯·诺依曼"存储程序"原理下,指令与数据共用同一种二进制编码、共享同一存储器——存储单元本身没有标签。区分必须靠时间维度——CPU 当前处于哪个周期阶段,决定了取出来的位串被解释为什么。

指令周期的两类访存阶段

阶段CPU 用什么地址访存取出的内容如何被解释送往哪
取指阶段(FE)PC(程序计数器)指令指令寄存器 IR
取数阶段(EX 中的访存子段)由 IR 中操作数地址字段算出的有效地址数据数据缓冲寄存器 / 通用寄存器

关键观察

  1. 同一个存储单元的同一段位串,在取指阶段被取就是"指令"、在取数阶段被取就是"数据"——两次访问的解释完全由 CPU 当前所处的阶段决定
  2. CPU 通过当前阶段类型来"选择"访存路径与目标寄存器:
    • 取指阶段访存 → 数据进入 IR → 进入译码 → 控制信号生成
    • 取数阶段访存 → 数据进入 GPRs / 数据缓冲 → 参与运算
  3. 没有任何一位"标识位"附在主存字节上来说明它是指令还是数据;存储器对 CPU 完全"沉默",只有 CPU 自己知道当前在做什么

冯·诺依曼 vs 哈佛——区分维度对照

架构区分维度物理存储区分依据
冯·诺依曼时间维度指令、数据共享同一存储器指令周期的不同阶段
哈佛空间维度指令存储器 + 数据存储器分开由访问的存储器决定

408 默认采用冯·诺依曼模型,所以"区分依据"问的就是"哪个时间阶段"。

逐项判定

选项判定关键理由
A译码发生在"已识别为指令"之后,因果倒置
B寻址方式是指令内部字段,不在"是不是指令"这一层
C取指阶段取出来即为指令,取数阶段取出来即为数据
D与冯·诺依曼原理矛盾,混入了哈佛架构的特征

最终答案是 C(指令周期的不同阶段)

易错点速记

  1. 冯·诺依曼 = 存储单元无标签——任何"靠存储位置区分""靠寻址方式区分""靠操作码区分"的说法都站不住,因为这些都是"识别之后"的事
  2. 区分发生在访存的瞬间——CPU 用 PC 访存就把结果当指令,用 EA 访存就把结果当数据
  3. 同一片内存可以前一个周期当指令、后一个周期当数据(如自修改代码 / JIT)——这正是冯·诺依曼"时间区分"的体现

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题