Appearance
题目
将汇编语言程序中实现特定功能的指令序列定义成一条伪指令。下列选项中,CPU 能理解并直接执行的是( )。
Ⅰ. 伪指令 Ⅱ. 微指令 Ⅲ. 机器指令 Ⅳ. 汇编指令
错因
A
把"伪指令"和"汇编指令"误当成 CPU 直接执行的对象。其实这两者都不是机器码:伪指令(如 ORG、EQU、DB、END)是给汇编器看的指令,告诉汇编器"在这里设地址"、"定义常量"等,不会被翻译进最终的机器代码;汇编指令(如 ADD R1, R2)是程序员写的助记符源码,必须经汇编器翻译成机器指令后 CPU 才能执行。CPU 只认机器码,不读源码。
C
把"汇编指令"也算成 CPU 直接执行——多半是把"汇编"和"机器"两个概念混了。汇编指令是源码层的助记符(mnemonic),必须先经汇编器翻译成机器指令的二进制位串,CPU 才能在取指阶段读到它。"用汇编写程序"≠"CPU 执行汇编"。
D
把伪指令也算上——可能是把"伪指令"望文生义为"伪装成指令的某种指令"。但伪指令的"伪"恰恰意味着它根本不是 CPU 执行的指令:在汇编阶段就被汇编器消化掉、不会出现在最终的可执行文件里。CPU 在运行时永远不会"取到"一条伪指令。
总解析
四类指令的层次划分:
| 类型 | 谁执行 | 何时存在 | 例 |
|---|---|---|---|
| 伪指令 | 汇编器 | 汇编阶段(不出现在可执行文件) | ORG 1000H、EQU、DB、END |
| 汇编指令 | 程序员/汇编器 | 汇编源码 | ADD R1, R2, R3 |
| 机器指令 | CPU(取指 → 译码 → 执行) | 可执行文件中的二进制 | 0x00112023 之类的 32 位编码 |
| 微指令 | CPU 控制器(更细粒度的硬件) | CPU 内部控存(ROM)中 | 一组微操作的控制信号 |
关键判断:CPU 能"理解并直接执行"的,必须是 CPU 硬件层面认识的对象。
- 机器指令:CPU 通过取指部件从内存读到二进制位串,译码后执行——直接执行 ✓
- 微指令:每条机器指令在 CPU 内部由一系列微指令驱动的微操作完成。微指令存储在控存中,由微程序控制器在硬件层面"取微指令 → 发控制信号"——也是 CPU 直接执行的 ✓
- 伪指令、汇编指令:两者都不是机器码,CPU 取指部件根本读不到——汇编阶段它们就被汇编器处理掉了
最终答案是 B(仅 II 和 III)。
层次速记:
程序员写汇编(含伪指令)→ 汇编器编译成机器指令 → CPU 取指执行; 每条机器指令在 CPU 内部由若干微指令展开成"取数 → ALU → 写回"的微操作序列。
伪指令"消失"在汇编阶段、汇编指令"消失"在翻译阶段;只有机器指令到了 CPU 取指阶段、再被进一步分解为微指令时,硬件才"看见"它们。