第八章 · CPU 的结构与功能 · 第三部分
LECTURE 02 part 02 / 02

中断
系统·

响应 · 隐指令 · 现场保护
多重中断 · 屏蔽技术
INTERRUPT SYSTEM — PART II 18 SLIDES
KEYBD PRINTER DISK TIMER PWR-FAIL OVERFLOW CPU EINT = 1
Fig. 0 — 中断请求向 CPU 汇聚 2026.05
AGENDA 本节路线图 · ROADMAP
SLIDE02/ 19

这一讲,我们沿着「中断的一生」把六件事讲清楚。

从 CPU 决定是否响应,到现场保护、嵌套、屏蔽、断点保护 —— 每一环都有它要解决的问题。
01
中断
响应
什么条件、什么时间、什么方式
EINT · QUERY
02
中断
隐指令
CPU 自动完成的三件事
HARDWARE
03
现场
保护与恢复
断点 + 寄存器,由谁完成
SAVE · RESTORE
04
中断
嵌套
后进先出,栈式管理
LIFO · STACK
05
屏蔽
技术
动态调整优先级
MASK
06
断点
保护策略
栈 vs 0 地址
STORAGE
PART II · ROUTE
01 · 中断响应RESPONSE CONDITION · TIMING · SIGNAL
SLIDE03/ 19
问题 03 · CPU 什么条件 / 什么时间 / 以什么方式响应中断

并不是所有的中断CPU 都一定会响应。

条件 · CONDITION
允许中断触发器
EINT = 1
只有当 EINT 被置 1,CPU 才"愿意"听外部中断的话。否则无论谁喊,CPU 一概不理。
时间 · TIMING
每条指令执行周期结束
INSTR-N INSTR-N+1 INSTR-N+2 中断周期 CHECK t
CPU 不会"半途"中断一条指令。它在每条指令收尾的瞬间抬头看一眼。
方式 · SIGNAL
CPU 主动发出
中断查询信号
CPU EINT=1 QUERY → INTR1 · 键盘 INTR2 · 打印机 INTR3 · 已置 1 ✓ INTR4 · 磁盘 ← RESPOND
CPU 发出查询信号 → 谁置 1 谁有戏 → 按优先级选一个。
FIG. 01 · RESPONSE
02 · 中断隐指令HIDDEN INSTRUCTION
SLIDE04/ 19
CPU 进入中断周期

三件事,硬件自动替你做完。

"隐指令"不是写在程序里的指令,而是 CPU 内部的一段固定时序 —— 它在中断周期里悄悄替你跑完。
REMEMBER
寄存器内容的保护、服务程序本身的执行 —— 这些是程序员的事;隐指令只管这三件入门动作。
1

保护程序断点

把当前 PC(也就是"我执行到哪了")存到特定位置。可以放进栈,也可以放到约定的 0 号地址。

PC → 栈 / 0 号地址
2

寻找中断服务程序入口

两条路:硬件向量法——直接把向量地址送进 PC;或者软件查询法——由中断识别程序找到入口再送 PC。

硬件向量 软件查询
3

硬件关中断

EINT 清 0,暂停其他中断申请,保证当前响应过程不被打断。设置中断标记触发器 / 允许中断触发器等。

EINT → 0
FIG. 02 · HIDDEN INSTR
02b · 入口地址FINDING THE HANDLER
SLIDE05/ 19
两种方式都能把入口地址送进 PC

硬件向量法 vs 软件查询法

A · 硬件向量法

向量地址 → 直接送 PC

硬件直接给出一个"向量地址",里面写的就是入口(或入口的跳转)。,主流方式。

主存 · MAIN MEMORY 12 JMP 200 13 JMP 300 14 JMP 400 200 SERVICE 1 300 SERVICE 2 400 SERVICE 3 PC ← 12 跳转执行
找到向量地址 12 → 取出 "JMP 200" → 进入服务程序 1
B · 软件查询法

查询程序逐个问 → 送 PC

中断识别程序依次问"是不是你",谁先被问到谁优先 —— 询问顺序 = 优先级

M+0 SKP DZ 1 ; if D1=0 skip M+1 JMP 1SR ; service-1 entry M+2 SKP DZ 2 M+3 JMP 2SR M+4 SKP DZ 3 M+5 JMP 3SR PRIORITY · 高
先问谁,谁优先级最高 · 这里 1 > 2 > 3
FIG. 03 · ENTRY LOOKUP
03 · 保护现场SAVE & RESTORE CONTEXT
SLIDE06/ 19
第四个问题:如何保护现场 · 第六个问题:如何恢复现场

"离开主程序之前要把它的样子拍下来,回来时原样摆好。"

现场 · 包含两部分

断点 + 寄存器内容

BREAKPOINT
PC
"我执行到哪了"
下次必须从这里继续
STATE
Rx
通用 / 状态寄存器
主程序运算的"中间值"
少存一样,回来就接不上 — 程序员必须把"主程序还需要用到的寄存器"全部保存下来。
谁负责

断点 — 由中断隐指令保存

硬件自动完成。CPU 在中断周期里直接把 PC 写到栈 / 0 号地址。

[HARDWARE · AUTOMATIC]
谁负责

寄存器 — 由中断服务程序保存

这要靠程序员编程实现 — 在服务程序最开头,用 PUSH 把要用到的寄存器逐个进栈。

[SOFTWARE · PROGRAMMED]
恢复现场

恢复 = 保护的"逆过程"

服务程序末尾用 POP 把寄存器一一弹回,最后由"中断返回指令"把 PC 还原 —— 主程序恍若未曾离开。

FIG. 04 · CONTEXT
03b · 服务程序ISR · FOUR STEPS
SLIDE07/ 19
中断服务程序 · INTERRUPT SERVICE ROUTINE

一段标准 ISR 的四个台阶

01
保护现场
SAVE STATE
PUSH 寄存器入栈
02
执行服务程序
SERVICE
不同中断源 → 不同实现
03
恢复现场
RESTORE STATE
POP 寄存器出栈
04
中断返回
IRET
PC ← 断点 · 回到主程序
① ⇄ ③
保护现场 与 恢复现场 互为逆过程。 先 PUSH 进去的,最后 POP 出来 —— 这正是栈的工作方式。下一页讲为什么"嵌套"必须用栈。
FIG. 05 · ISR FLOW
04 · 中断嵌套NESTING · LIFO
SLIDE08/ 19
第七个问题 · 中断中又出中断

允许嵌套时,断点会"摞"起来。

三个断点的保存顺序,正好是恢复顺序的反向 —— 这就是「后进先出」(LIFO)。
PUSH 保存断点 → 入栈
POP 恢复断点 → 出栈
LIFO 后保存的,最先恢复
PUSH PC1   ; 主程序断点
  PUSH PC2  ; ISR-1 断点
    PUSH PC3; ISR-2 断点
    ...
    POP  PC3  ; ← 最先弹出
  POP  PC2
POP  PC1
STACK · 栈式管理
SP → PC₁ (主→ISR1) PC₂ (1→ISR2) PC₃ (2→ISR3) PUSH ↓ POP ↑ SP grows downward
FIG. 06 · NEST STACK
04b · 多重中断K-L-M BREAKPOINTS
SLIDE09/ 19
三层嵌套 · 三个断点

同一张图,三次离开 · 三次返回

主程序 中断 ① 中断 ② 中断 ③ K SAVE K+1 L SAVE L+1 M SAVE M+1 POP M+1 POP L+1 POP K+1 t 主程序 ISR1 ISR2 ISR3 ━━ 红色 = 断点
SAVE ORDER
K+1 → L+1 → M+1
RESTORE ORDER
M+1 → L+1 → K+1
CONCLUSION
恰好相反 → 用栈
FIG. 07 · NESTED FLOW
04c · 实例推演WORKED EXAMPLE · A > B > C > D
SLIDE10/ 19
前提:开中断指令已执行 · 高优先级有权打断低优先级

四个中断源 A > B > C > D,一段交错的时间线。

A · 最高 B C D · 最低
点击 ▶ 开始推演
主程序 A · ISR B · ISR C · ISR D · ISR B请求 C请求 D请求 A请求 t
05 · 屏蔽技术INTERRUPT MASKING
SLIDE11/ 19
外部加一个开关

MASK 决定 INTR 能不能"出门"。

为每个中断源配一个屏蔽位 MASKi ——
MASKi = 1 → 屏蔽掉 INTRi(该中断不响应
MASKi = 0 → 放行 INTRi(该中断可响应
作用
一组 MASK 位 = 一个屏蔽字。改写它,就改写了优先级。
INTR₁ AND MASK=0 ✓ INTR₂ AND MASK=1 ✗ 屏蔽 INTR₃ AND MASK=0 ✓ INTR₄ AND MASK=1 ✗ 判优逻辑 PRIORITY → CPU MASK 位作"门控" · 只让允许的中断进入判优
FIG. 08 · MASK GATE
05b · 屏蔽字MASK WORD & PRIORITY
SLIDE12/ 19
16 个中断源 · 看一张表就懂

屏蔽字 = 这一级"能屏蔽谁"的名单

第 i 行 = 当 ISRi 运行时硬件挂上的开关组合
"1" 我能压住它 · "0" 我压不住
优先级 中断源 屏蔽字 (1 = 屏蔽 · 0 = 放行) — 16 位 能压住
读法 · 高优先级
第 1 级 = 1111 1111 1111 1111 — 能屏蔽包括自己在内的全部 16 个中断。
读法 · 低优先级
第 16 级 = 0000 0000 0000 0001 — 只能"自己屏蔽自己",谁都打不过。
TBL. 01 · MASK WORD
05c · 动态优先级RE-ORDER ON THE FLY
SLIDE13/ 19
屏蔽字的高阶玩法

把屏蔽字改写一下 —— 6 号也能"压住"5 号

默认

第 5 级屏蔽字

  1111  1000  0000 0000
第 6 位 = 0 → 5 级压不住 6 级。
按默认规则:5 > 6。
改写后

把第 6 位置 1

  1111  1100  0000 0000
一行赋值 —— 5 级也能压住 6 级。
优先级被动态翻转。
屏蔽技术 · 其他应用
人为屏蔽掉某个中断源 —— 比如某段关键代码里不想被键盘打断,置位它的 MASK 即可。
本质
屏蔽字是"权力清单"。改清单 = 改优先级 = 改控制流。极其灵活。
FIG. 09 · DYN PRIORITY
06 · 断点保护STACK vs ZERO-ADDR
SLIDE14/ 19
多重中断 · 多个断点需要存放

两种"放断点"的方式 —— 各有命门。

方案 A · 入栈

每次入栈 · 后进先出

由中断隐指令完成 PUSH PC。返回时 POP PC

STACK · 多个断点共存 PC₁ (主→ISR1) PC₂ (ISR1→ISR2) PC₃ (ISR2→ISR3) ✓ 多重中断完美兼容
方案 B · 0 号地址

约定一个固定地址放 PC

把 PC 写到 0 号主存单元 (也可灵活设其他地址)。同样由中断隐指令完成。

FIXED ADDR · 0 号主存单元 [0] PC₃ PC₁ PC₂ PC₃ ⚠ 后写覆盖前写 CONFLICT 单次中断够用 · 嵌套需另想策略
FIG. 10 · BREAKPOINT SAVE
06b · 微操作μ-OP SEQUENCE FOR ZERO-ADDR
SLIDE15/ 19
把 PC 存到 0 号单元,硬件做了什么?

三步微操作 ——由中断隐指令完成

1
0 MAR
指定地址寄存器
2
1 W
主存"写"信号有效
3
PC MDR M[0]
数据写入
CONFLICT
发生 3 次中断 → 3 个断点都想往 [0] 里写。后写的会覆盖先写的,前面的断点丢失
▶ 解决思路:把数据搬到别的位置,保证后面不覆盖前面。
▶ 最朴素的就是—— 用栈。
ROUND 0 / 3 CPU REGISTERS PC K+1 MDR MAR W (write) 0 MAIN MEMORY · [0] [0] 写入历史 · WRITE HISTORY 中断 1 ⚠ 被覆盖 中断 2 ⚠ 被覆盖 中断 3 最新 · 仅存活 CONFLICT 3 个断点都被写进 [0] 前 2 个 永久丢失 ✗ ▶ 点击 STEP 启动
FIG. 11 · μ-OP
SUMMARYSECTION RECAP
SLIDE16/ 19
本节小结

围绕中断系统,我们解决了四件事:

01

系统要解决
的问题

7 个问题 → 响应、判优、保护、入口、恢复、嵌套

02

判优逻辑
设计

硬件链式排队器 / 集中编码器;软件按询问顺序

03

中断处理
的过程

隐指令 → ISR 四步 → 嵌套用栈

04

屏蔽
设计

MASK 位 → 屏蔽字 → 动态改优先级

"
整个中断系统的实现,采用的是硬件 + 软件协同的方式 —— 硬件保证速度和确定性,软件保证灵活和可编程。
RECAP
QUESTION
思考题 SLIDE 17 / 19
CPU
究竟
做了
什么?
THINK BEFORE NEXT LECTURE
课后思考
"在中断处理的过程当中,
CPU 发挥了什么样的作用
这个作用是不是重要?"
线索 ①
隐指令里 CPU 自动完成的三件事
线索 ②
谁发出中断查询信号
线索 ③
判优逻辑在哪里被实现
线索 ④
EINT 在不同时刻的状态
ANSWER思考题 · 完整解答
SLIDE18/ 19
回答上一页的问题

CPU 是中断系统的主控者 —— 没有它,一切只是"喊话"。

1
QUERY · 询问者

发出中断查询信号

每条指令执行周期结束,CPU 主动询问 INTR 触发器 —— 否则外设举手没人看。

CPU → INTR 触发器
2
GATE · 把关者

EINT 的总开关

CPU 内部的 EINT 触发器决定"听不听"。开中断 / 硬件关中断的状态翻转都由 CPU 完成。

EINT = 1 / 0
3
JUDGE · 仲裁者

判优逻辑的执行

集中式硬件判优逻辑就坐落在 CPU 内 —— 一组与非门排出谁优先级最高,给出唯一胜出者。

PRIORITY ENCODER
4
HIDDEN · 执行隐指令

中断周期的全部动作

保护断点、寻入口、关中断 —— 这"三件事"是由 CPU 的微指令时序自动完成的,无需任何软件参与。

PC→栈 · PC←向量 · EINT←0
5
RUN · 执行 ISR

取指 · 译码 · 执行

服务程序里每一条 PUSH / 服务逻辑 / POP / IRET,都是 CPU 在跑 —— 软件由它推动。

FETCH · DECODE · EXEC
6
RETURN · 返回者

恢复 PC,回到主程序

IRET 由 CPU 把保存的断点弹回 PC,并重新开中断 —— 整个中断的"句号"也是它画的。

PC ← 栈 · EINT ← 1
结论 — 极其重要。外设只能"提请求";从是否响应、何时响应、响应谁、如何保护现场、到何时返回,每一个决定都由 CPU 做。硬件保证速度、软件保证灵活,但两者都跑在 CPU 这根主轴上
FIG. 12 · ANSWER
END OF PART II
? 谢谢
INTERRUPT · PART II 2026