Appearance
题目
中断处理和子程序调用都需要压栈以保护现场,中断处理一定会保存而子程序调用不需要保存其内容的是( )。
错因
A
PC 两者都要保存——子程序调用 call 指令把返回地址(PC+1)压栈、中断也要把 PC 入栈以便恢复。区别不在 PC 上。把它当成中断独有就错了:返回机制对两者都不可少。
C
通用数据寄存器在两种情况下都按需保存——子程序如果用到了某些寄存器要保存好以便返回,中断处理也要保存。两者都可能保存,不是中断独有。
D
地址寄存器同 C,两者都按需保存。把它当成中断独有的也不对——不存在"子程序不需要保存而中断需要"的差异。
总解析
中断处理 vs 子程序调用 的核心差异:中断处理涉及状态变化(中断使能位、屏蔽位、CPU 模式等)+ 可能跨进程;子程序调用不涉及。
| 寄存器 | 子程序调用 | 中断处理 |
|---|---|---|
| PC(程序计数器) | ✓ 保存(call 自动压栈) | ✓ 保存(中断隐指令) |
| 通用数据/地址寄存器 | 按需保存(被调用方按调用约定) | 按需保存(ISR 用到的也要保存) |
| PSW(程序状态字) | ✗ 不保存(同进程同执行流,PSW 不变) | ✓ 必保存 |
为什么中断必须保存 PSW:
PSW 包含:
- CPU 模式位(用户态 / 内核态)——中断从用户态进入内核态会改变这位,恢复时要复原
- 中断屏蔽字 / 中断使能位——ISR 期间可能屏蔽某些中断,恢复时要复原原始屏蔽情况
- 条件码 / 标志位(CF, ZF, SF, OF 等)——中断打断了被中断指令的"自然"执行流,标志位要保护
子程序调用不跨态、不改屏蔽字、运行环境跟调用者一致,PSW 不需要保存。
速记:中断 = 子程序调用 + PSW 保存 + 态/屏蔽变化。多出来的"PSW 必保存"就是两者最直接的区别。
最终答案是 B。