Appearance
题目
下列关于外部 I/O 中断的叙述中,正确的是( )。
错因
A
错把"先来先服务"当成了中断优先级机制。实际上中断优先级由屏蔽字决定(详见 2011-21)——多个中断同时来时,按"屏蔽字定义的处理优先级"排序,与到达时间无关。先到的低优先级会被后到的高优先级抢占,先到不等于先处理。
B
错把"保护通用寄存器"算到中断隐指令头上。中断隐指令只做三件事:①关中断 ②保存断点(PC、PSW)③形成入口送 PC——不包含保护通用寄存器。通用寄存器由 ISR 第一段的"保护现场"软件代码 push 到栈,是软件做的,不是硬件做的。详见 2012-22。
D
错在"立即暂停当前指令执行"——CPU 不会在指令中段响应中断,必须等当前指令执行完毕(到指令边界)才响应。中段响应会导致 PC、PSW 状态不一致,无法干净保存断点。"立即"二字是错点。
总解析
逐项审计:
| 选项 | 说法 | 正/误 | 关键判据 |
|---|---|---|---|
| A | 中断控制器按到达先后排优先级 | ✗ | 优先级由屏蔽字定,不看到达顺序 |
| B | 隐指令保护通用寄存器 | ✗ | 隐指令只做关中断 + 保断点 + 送入口,不动通用寄存器 |
| C | CPU 在中断允许状态才能响应外部中断 | ✓ | 中断使能位是响应的硬性前提 |
| D | 有请求 CPU 立即暂停指令转 ISR | ✗ | 必须等指令执行结束才响应 |
C 为什么成立:
CPU 内部有一个"中断允许位"(PSW 中的 IF 标志、IE bit 等不同 ISA 命名不同,但作用相同):
- IF = 1:开中断态——允许响应外部中断
- IF = 0:关中断态——屏蔽所有外部中断(不可屏蔽中断 NMI 除外)
只有 IF = 1 时,CPU 在指令边界采样中断请求引脚才会真正响应中断;IF = 0 时即便外部一直在拉中断线,CPU 也"装作没看见",把请求挂起,直到 IF 重新置 1。
这是为什么 ISR 入口前会硬件自动关中断——保护现场期间不允许嵌套;ISR 中段又会软件开中断——允许多重中断系统的高优先级抢占。
最终答案是 C(这是正确叙述)。
外部中断响应的完整三个前提(缺一不可):
- 存在中断请求——外部设备拉起中断线,中断控制器送到 CPU 引脚
- 未被屏蔽——屏蔽字对应位为 0
- 中断允许态(IF = 1)——这是 C 选项强调的
只有三者同时成立,CPU 才在当前指令结束时响应中断。这道题考的就是第 3 个前提。
易混淆点速查:
| 说法 | 正确版本 |
|---|---|
| "立即响应" | "指令结束时响应"(边界响应) |
| "按先后顺序排优先级" | "按屏蔽字定义的优先级"(动态可调) |
| "隐指令保护通用寄存器" | "隐指令保断点,软件保通用寄存器"(硬软件分工) |
| "关中断也能响应" | "开中断才能响应外部中断"(IF = 1) |
编者注(生僻术语):题面"中断允许状态"对应不同教材有不同名字——王道叫"中断使能位"、汤子瀛叫"中断允许标志",本质都是 PSW 里那 1 位。看到任何一个表述都按"IF = 1 才能响应外中断"理解。