Appearance
题目
下列选项中,由指令体系结构(ISA)规定的是( )。
错因
A
把"乘法指令"的存在和"乘法器的实现方式"混了——觉得既然 ISA 规定有 MUL 指令,那也连带规定乘法器怎么搭。实际上 ISA 只规定"有没有乘法指令、它的语法/语义/编码";乘法器是阵列还是 ALU 循环 + 移位,是微架构自由发挥的实现细节,不同代 CPU 用同一个 ISA 但乘法器实现完全不同(如 Intel 多代 x86)。
C
控制器实现方式属于微架构层面。同一套 ISA 既可以用微程序控制器实现(早期 x86),也可以用硬连线控制器实现(RISC、现代 x86 内核)——程序员看到的指令行为完全一样,区别只在 CPU 内部如何把每条指令翻译成控制信号。所以 C 不是 ISA 规定的内容。
D
数据通路是单总线、双总线还是三总线,也是微架构问题——它影响 CPI 和时钟周期划分,但不影响"程序员能写哪些指令、指令长什么样"。同一个 ISA 在课本里常用单总线讲解,在实际处理器里用多总线/流水线实现,互不矛盾。选 D 的人把"硬件资源结构"误当作了 ISA 范畴。
总解析
思路:核心区分是 ISA(程序员可见的"接口约定")和 微架构(实现 ISA 的硬件方式)。
ISA 规定的内容(程序员可见):
| 类别 | 例子 |
|---|---|
| 指令格式 | 定长 / 变长指令字、操作码长度、字段划分 |
| 指令集合 | 算术、逻辑、Load/Store、控制转移… |
| 寻址方式 | 直接、寄存器、立即数、变址、相对 |
| 寄存器组织 | 通用寄存器数量、专用寄存器(PC, PSW…) |
| 数据类型 | 整数位宽、浮点格式、字节序 |
| 异常 / 中断模型 | 异常向量、中断响应方式 |
| 内存模型 | 字节编址 / 字编址、对齐、虚拟地址位数 |
微架构决定的内容(程序员不可见):
| 类别 | 例子 |
|---|---|
| 控制器实现 | 微程序 vs. 硬连线 |
| 数据通路 | 单总线 / 多总线、流水线段数 |
| 运算部件 | 阵列乘法器 / ALU 循环、加法器结构 |
| 存储层次 | Cache 大小/组织、TLB、预取策略 |
| 流水线优化 | 转发、分支预测、乱序、寄存器重命名 |
逐项核验:
| 选项 | 内容 | 归属 | 结论 |
|---|---|---|---|
| A | 阵列乘法器 | 运算部件实现 → 微架构 | 不属于 ISA |
| B | 定长指令字格式 | 指令编码格式 → ISA | 由 ISA 规定 |
| C | 微程序控制器 | 控制器实现 → 微架构 | 不属于 ISA |
| D | 单总线数据通路 | 数据通路结构 → 微架构 | 不属于 ISA |
只有 B 是程序员能从指令二进制里直接看出来的——拿到任何一条指令机器码,长度是 4 字节还是变长,是 ISA 文档明文规定的。换微架构(同一 ISA 不同实现)这个事实不变。
最终答案是 B。
ISA vs. 微架构 一句话区分:
ISA = 程序员看得见的硬件——指令长什么样、有哪些寄存器、怎么寻址; 微架构 = 程序员看不见的硬件——同一 ISA 用什么电路、什么流水线、什么 Cache 实现。
凡是带"是否采用 X 部件 / 结构 / 控制方式"措辞的,多半是微架构问题;凡是讨论"指令长什么样、有什么类型、怎么寻址、寄存器怎么组织"的,是 ISA。