中断系统-第13章-计算机组织与系统结构
一、本章概述
本章是 1A003 计算机组织与系统结构课程的第 13 章,共 132 页,系统讲解中断系统的基本概念、80x86 实模式中断机制以及可编程中断控制器 8259A 的工作原理与编程。中断系统是计算机实现”分时操作""实时处理""故障处理”三大能力的核心硬件机制,也是 I/O 接口与 CPU 通信的关键桥梁。
本章三大核心内容:
- 中断基本概念——定义、响应过程、优先级与嵌套
- 80x86 实模式中断系统——分类、向量表、外部/内部中断、完整响应流程
- 可编程中断控制器 8259A——引脚、内部结构、工作方式、控制字、编程与应用
前置关联:输入输出接口-第11章-计算机组织与系统结构(第 11 章 I/O 接口中已介绍了三种 I/O 控制方式:程序查询 / 中断 / DMA,本章深入展开中断机制)
二、中断基本概念
2.1 中断的定义
在程序运行时,系统外部、内部或现行程序本身若出现紧急事件,处理器必须立即强行中止现行程序的运行,改变机器的工作状态并启动相应的程序来处理这些事件,然后再恢复原来的程序运行。这一过程称为中断。
中断的本质是”程序切换”——硬件触发 + 软件处理的协作机制。
2.2 中断响应和处理过程(六步法)
CPU 在执行每条指令的最后一个机器周期的最后一个时钟周期检测中断请求信号输入线。若发现中断请求有效(可屏蔽中断还需 IF=1),则在下一机器周期进入中断响应周期。
整个中断过程分为 6 步:
| 步骤 | 操作 | 负责方 | 说明 |
|---|---|---|---|
| ① 关中断 | 发 INTA 信号,内部自动关中断 | 硬件 | 禁止接受其他中断请求 |
| ② 保存断点 | IP、CS 压入堆栈 | 硬件 | 确保中断处理完能返回主程序 |
| ③ 识别中断源 | 找到中断服务程序入口地址 | 硬件 | 中断向量法 / 查询法 / 向量中断 |
| ④ 保护现场 | 有关寄存器 + 标志寄存器压栈 | 软件(中断服务程序) | 不影响主程序状态 |
| ⑤ 执行中断服务程序 | 执行具体中断处理 | 软件 | 可在适当时候重新开中断以支持嵌套 |
| ⑥ 恢复现场并返回 | 弹栈 + IRET 指令 | 软件 | 返回主程序继续运行 |
关键区分:前 3 项是中断响应过程,由中断系统硬件自动完成;后 3 项是中断处理过程,由软件(中断服务程序)负责完成。
中断服务程序设计者必须清楚:硬件在响应时已经做了哪些操作(如 PSW 是否已压栈),还需软件补充哪些操作。
2.3 中断优先级
多个中断请求同时出现时,CPU 必须按一定次序响应,这个响应次序称为中断优先级(Priority)。根据中断源的重要性和实时性确定。
(1)软件查询法
- 将所有设备的中断请求相”或”产生总的 INTR 信号
- CPU 响应后,在中断处理程序开头安排一段带优先级的查询程序
- 查询的先后顺序 = 优先级的高低(先查 = 优先级高)
- 优点:只需少量硬件电路,优先级可灵活修改
- 缺点:查询耗时,中断响应慢
(2)菊花链优先级排队电路(硬件方案)
- 在每个设备接口设置简单逻辑电路
- 根据优先级顺序传递或截留 CPU 发出的 INTA 中断响应信号
- 优先级高的设备靠近 CPU,INTA 信号沿菊花链逐级传递
- 高优先级设备有请求时截留 INTA,低优先级设备收不到响应信号
- 优点:纯硬件,响应速度快
- 缺点:优先级固定,灵活性差
(3)可编程中断控制器(现代方案)
- 如 8259A,专门的中断管理芯片
- 可编程设置优先级、屏蔽、触发方式等
- PC 机标准方案
2.4 中断嵌套
当 CPU 正在执行优先级较低的中断服务程序时,允许响应比它优先级高的中断请求,将正在处理的中断暂时挂起,这就是中断嵌套。
- CPU 先为级别高的中断服务,结束后返回到被中断的较低级继续服务
- 中断嵌套的深度受堆栈容量限制(每次中断都要压入断点和现场)
- 实现嵌套的前提:中断服务程序中执行 STI 指令重新开中断
三、80x86 实模式中断系统
3.1 中断分类
8086/8088 把中断分为内部中断和外部中断两大类。80386 以上处理器把外部中断称为”中断”,内部中断称为”异常(Exception)”。
异常又可分为三类:
- 故障(Fault):指令执行前检测到,可恢复,返回后重新执行该指令(如缺页)
- 陷阱(Trap):指令执行后触发,用于调试(如断点 INT 3)
- 中止(Abort):严重错误,程序无法继续执行(如硬件故障)
80x86 实模式中断分类:
软件中断(内部中断):
├─ 除法错中断(类型 0)
├─ 单步中断(类型 1, TF=1)
├─ 非屏蔽中断 NMI(类型 2)— 注意:NMI 属于硬件但类型固定
├─ 断点中断 INT 3(类型 3)
├─ 溢出中断 INTO(类型 4, OF=1)
└─ INT n 指令中断
硬件中断(外部中断):
├─ 非屏蔽中断 NMI(不可屏蔽)
└─ 可屏蔽中断 INTR(受 IF 标志控制,经 8259A 管理)
3.2 中断向量表
所谓中断向量,就是中断服务程序的入口地址。每个中断类型对应一个中断向量。
- 每个中断向量占 4 字节:前 2 字节存偏移量 IP(低字节在前),后 2 字节存段基值 CS(低字节在前)
- 80x86 实模式支持 256 个中断(类型码 0~255)
- 中断向量表位于存储器最低端 00000H ~ 003FFH,共 1KB 空间
中断向量表的结构(按类型码顺序排列):
| 地址范围 | 类型码 | 用途 |
|---|---|---|
| 00000H~00013H | 0~4 | 专用中断(5个) |
| 00014H~0007FH | 5~31 | 保留中断(27个,Intel 保留) |
| 00080H~003FFH | 32~255 | 用户定义中断(224个) |
中断向量地址计算:
- 中断类型码 N × 4 = 向量在表中的起始地址
- IP ← (4N, 4N+1)
- CS ← (4N+2, 4N+3)
例:类型码 27H 的中断向量地址 = 27H × 4 = 009CH,从 0000:009CH 开始的 4 个字节存 IP 和 CS。
3.3 外部中断(硬件中断)
80x86 CPU 有两条外部中断引线:NMI 和 INTR。
(1)非屏蔽中断 NMI
- 从 NMI 引脚进入,不受 IF 标志影响(不可屏蔽)
- 中断类型码固定为 2
- 入口地址存放在 08H~0BH 四个字节单元
- 用于处理紧急事件(如电源掉电、存储器校验错)
(2)可屏蔽中断 INTR
- 一般外部设备请求都从 INTR 端引入
- 受 IF 标志控制:IF=1 时允许响应,IF=0 时禁止响应
- STI 指令开中断(IF=1),CLI 指令关中断(IF=0)
- 中断响应需要两个 INTA 总线周期:
- 第一个 INTA 负脉冲:通知中断源响应,冻结 IRR,置位 ISR
- 第二个 INTA 负脉冲:读取中断类型码
3.4 内部中断(软件中断)
由 CPU 内部事件或执行 INT 指令引起,共 5 类:
(1)INT n 指令中断
- 直接调用中断处理子程序,n 为中断类型码
- 类型码由指令直接给出,无需 INTA 总线周期
(2)除法错中断(类型 0)
- 执行 DIV/IDIV 后,商超出目标寄存器表示范围(或除数为 0)
- CPU 立即产生 0 型中断
(3)溢出中断(类型 4)
- 上一条指令使 OF=1 时,执行 INTO 指令触发 4 型中断
- OF=0 时,INTO 为空操作
- 通常安排在算术运算指令之后
(4)单步中断(类型 1)
- TF=1 时,CPU 每执行完一条指令就自动产生 1 型中断
- 用于程序调试(逐条跟踪)
(5)断点中断(类型 3)
- INT 3 指令,单字节指令(其他 INT n 都是两字节)
- 用于在程序中设置断点调试
- 常与单步中断结合使用:先设断点定位错误范围,再单步跟踪
内部中断的三大特点
- 中断类型码由 CPU 内部自动提供(从 INT n 指令提取或硬件生成),不需要 INTA 总线周期读类型码
- 除单步中断外,所有内部中断都不可用软件屏蔽(单步可通过 TF 位控制)
- 除单步中断外,所有内部中断的优先级都比外部中断高
3.5 中断响应和中断处理过程
80x86 实模式完整中断处理流程
结束当前指令
│
├─ 除法错 / INTO / INT n? ──Y──→ 内部自动形成类型码 N ──┐
│ │
├─ NMI? ────────────────────Y──→ 类型码=2 ────────────────┤
│ │
├─ INTR?(IF=1时)──────────Y──→ 读中断类型码 N ──────────┤
│ │
└─ TF=1? ──────────────────Y──→ 类型码=1(单步)─────────┤
↓
令 TEMP = TF
清除 IF 和 TF(关中断、关单步)
PSW(标志寄存器)压栈
CS、IP 压栈
(4N, 4N+1) → IP
(4N+2, 4N+3) → CS
执行中断服务程序
│
执行 IRET 指令
IP、CS 出栈
标志寄存器出栈
返回被中断的主程序
80x86 实模式中断优先级(从高到低):
- 除法错、INT n、INTO(最高)
- NMI 非屏蔽中断
- INTR 可屏蔽中断
- 单步中断(最低)
重要细节:响应中断时硬件自动做的事——① 清除 IF 和 TF ② 标志寄存器压栈 ③ CS 和 IP 压栈 ④ 取新的 CS 和 IP。
注意:80x86 的中断响应硬件自动压入了 PSW,所以中断服务程序中不需要再压标志寄存器。IRET 指令会同时弹出 IP、CS 和 PSW。
3.6 单步 + 中断的复合处理
单步运行(TF=1)时发生其他中断的处理顺序:
- 当前指令结束,检测到更高优先级中断(如除法错)
- 响应该高优先级中断(压栈 PSW/CS/IP,清 IF/TF,跳转)
- 执行该中断服务程序
- 执行 IRET 返回,弹出 PSW → TF 恢复为 1
- 立即触发单步中断(因为 TF=1)
- 执行单步中断服务程序
- 单步 IRET 返回,回到主程序下一条指令
即:单步方式下,每执行一条指令先响应该指令触发的中断,返回后再触发一次单步中断。
四、可编程中断控制器 8259A
4.1 概述
Intel 8259A 是专门用于管理和控制 80x86 外部中断请求的可编程芯片:
- 优先级判决、提供中断类型码、屏蔽中断输入
- 单片管理 8 级中断(IR0~IR7)
- 级联方式最多 64 级(1 主 + 8 从 = 9 片)
4.2 引脚功能(28 脚 DIP 封装)
| 引脚 | 功能 | 方向 |
|---|---|---|
| D7~D0 | 双向数据总线 | 双向 |
| IR0~IR7 | 中断请求输入(8级) | 输入 |
| INT | 向 CPU 发中断请求 | 输出 |
| INTA | 中断响应信号(接收 CPU 脉冲) | 输入 |
| RD | 读信号(低有效) | 输入 |
| WR | 写信号(低有效) | 输入 |
| CS | 片选信号(低有效) | 输入 |
| A0 | 地址线(选择内部寄存器端口) | 输入 |
| CAS0~CAS2 | 级联线(主片输出/从片输入) | 双向 |
| SP/EN | 主片/从片选择 或 缓冲器使能 | 双功能 |
A0 寻址:A0=0 为偶地址,A0=1 为奇地址。8259A 只有两个端口地址。
SP/EN 双功能:
- 非缓冲方式(BUF=0):作为输入,SP=1 为主片,SP=0 为从片
- 缓冲方式(BUF=1):作为输出,EN 有效时启动数据总线收发器,主/从由 ICW4 的 M/S 位决定
4.3 内部结构
8259A 内部由以下主要部件组成:
IR0~IR7 ─→ IRR ─→ ┌─────────┐
│ PR 裁决 │ ─→ INT ─→ CPU
ISR ─→ └─────────┘
↑
IMR(屏蔽寄存器)
四大核心寄存器:
| 寄存器 | 全称 | 功能 |
|---|---|---|
| IRR | Interrupt Request Register | 中断请求寄存器,8 位,锁存 IR0~IR7 上的中断请求 |
| ISR | In-Service Register | 中断服务寄存器,保存当前正在处理的中断(置 1 表示正在服务) |
| IMR | Interrupt Mask Register | 中断屏蔽寄存器,对应位为 1 则屏蔽该级中断 |
| PR | Priority Resolver | 优先级裁决器,比较新请求与当前服务的优先级 |
中断处理流程(8259A 视角):
- IRi 上出现中断请求 → IRR 对应位置 1
- IMR 对应位为 0(未屏蔽)则请求通过
- PR 裁决:新请求与当前 ISR 中最高优先级比较
- 若新请求优先级高 → 向 CPU 发 INT 信号
- CPU 响应(IF=1),回发两个 INTA 负脉冲
- 第一个 INTA:IRR 锁存禁止(不接受新请求),ISR 对应位置 1,清除 IRR 对应位
- 第二个 INTA:送出中断类型码到数据总线;若 AEOI=1 则同时清除 ISR 对应位
4.4 编程结构(7 个可访问寄存器)
分两组命令字:
- ICW1~ICW4(初始化命令字):系统启动时设定
- OCW1~OCW3(操作命令字):运行时动态设置
寄存器寻址(A0 + 标识位):
| 寄存器 | A0 | 标识位 | 说明 |
|---|---|---|---|
| ICW1 | 0 | D4=1 | 偶地址写入,D4=1 标志 |
| ICW2 / ICW3 / ICW4 | 1 | — | 奇地址,按初始化顺序识别 |
| OCW1 | 1 | — | 奇地址写入(不紧跟 ICW1 时) |
| OCW2 | 0 | D4=0, D3=0 | 偶地址,D4D3=00 标志 |
| OCW3 | 0 | D4=0, D3=1 | 偶地址,D4D3=01 标志 |
巧妙之处:仅用一根 A0 地址线,通过标识位和写入顺序区分 7 个寄存器。
五、8259A 的工作方式
5.1 优先级设置方式(4 种)
(1)全嵌套方式(Fully Nested Mode)
- 固定优先级:IR0(最高)→ IR7(最低)
- 初始化后默认进入此方式
- ISR 对应位在 EOI 前一直保持为 1 → 封锁同级或低级中断,但允许更高级中断(即嵌套)
- 最常用的方式
(2)特殊全嵌套方式(Special Fully Nested Mode, SFNM)
- 处理某级中断时,既允许更高级,也允许同级中断请求进入
- 用于主从结构的主片(主片上的从片中断需要支持从片内部嵌套)
- 通过 ICW4 的 SFNM 位设置
(3)优先级自动循环方式(Automatic Rotation)
- 优先级循环变化:一个设备中断服务完成后,其优先级自动降为最低,原来比它低一级的升为最高
- 初始队列:IR0 > IR1 > IR2 > … > IR7
- 响应 IR0 后队列变为:IR1 > IR2 > … > IR7 > IR0
- 适用于各设备优先级相近的场合
- 由 OCW2 设置
(4)优先级特殊循环方式(Specific Rotation)
- 与自动循环类似,但可以指定初始最低优先级
- 如设定 IR4 为最低,则 IR5 为最高,其余按循环类推
5.2 中断屏蔽方式(2 种)
(1)普通屏蔽方式
- 通过 IMR 屏蔽某级或某几级中断(OCW1 设置)
- 被屏蔽的中断请求无法送到 PR
(2)特殊屏蔽方式(Special Mask Mode, SMM)
- 只屏蔽本级,允许更低级的中断请求进入
- 用于需要在中断服务中动态开放低级中断的场合
- 设置步骤:OCW3(ESMM=1, SMM=1) + OCW1(屏蔽本级)
- 撤销步骤:OCW1(开放本级) + OCW3(ESMM=1, SMM=0)
5.3 中断结束方式(3 种 EOI)
EOI = End of Interrupt,即清除 ISR 中的对应位。
(1)自动结束方式(AEOI)
- 在第二个 INTA 脉冲的后沿,自动将 ISR 对应位复位
- 注意:是在中断响应后就清 ISR,不是在中断处理结束后
- 中断处理过程中 8259A 没有”正在处理”标识 → 任何优先级的中断都能响应
- 容易造成”二次中断”(中断请求信号未及时撤销时)
- 适用于:中断请求信号持续时间有限、不出现中断嵌套的场合
- 通过 ICW4 的 AEOI=1 设置
(2)一般(普通)EOI 方式
- 适合全嵌套方式
- 中断服务程序结束时,向 8259A 发普通 EOI 命令(OCW2: EOI=1, SL=0, R=0,即 20H)
- 自动清除 ISR 中最高优先级的置 1 位(全嵌套下最高 = 当前正在服务)
- 例:
MOV AL, 20H→OUT 20H, AL
(3)特殊 EOI 方式(SEOI)
- 适合非全嵌套方式(优先级循环、特殊屏蔽),此时 ISR 中无法确定哪一级是当前服务
- 用 OCW2 的 L2~L0 明确指定清除 ISR 的哪一位
- OCW2: EOI=1, SL=1, R=0 + L2~L0 指定 IR 编号
5.4 中断触发方式(2 种)
- 电平触发:IRi 上的有效电平触发请求(LTIM=1)
- 边沿触发:IRi 上的低→高跳变触发请求(LTIM=0,默认)
由 ICW1 的 LTIM 位设置。
5.5 连接系统总线方式(2 种)
- 缓冲方式(BUF=1):8259A 通过总线收发器(如 8286)与数据总线相连,SP/EN 作为输出(EN 有效),M/S 位决定主/从
- 非缓冲方式(BUF=0):直接与数据总线相连,SP/EN 作为输入(SP 决定主/从)
5.6 中断查询方式
- 结合了中断和查询的特点
- 外设仍向 8259A 发中断请求,但 CPU 的 IF=0(不响应外部中断)
- CPU 用软件查询确认中断源:先发查询命令(OCW3, P=1),再读 8259A 获得”中断状态字”
- 中断状态字格式:D7 位(IR)=1 表示有中断请求,D2
D0(W2W0)= 当前最高优先级编号 - 适用于:中断优先级很低、或 CPU 不便响应中断的场合
六、8259A 控制字详解
6.1 初始化命令字 ICW
(1)ICW1(偶地址 A0=0,D4=1 标志)
D7 D6 D5 D4 D3 D2 D1 D0
0 A7 A6 A5 1 LTIM ADI SNGL IC4
| 位 | 名称 | 功能 |
|---|---|---|
| D0 | IC4 | 1=需要写入 ICW4;0=不需要 |
| D1 | SNGL | 1=单片方式;0=级联方式(需写 ICW3) |
| D2 | ADI | 8085 用,80x86 不用 |
| D3 | LTIM | 1=电平触发;0=边沿触发 |
| D4 | — | 固定为 1(ICW1 标识位) |
| D5~D7 | A5~A7 | 8085 用,80x86 不用 |
(2)ICW2(奇地址 A0=1,紧跟 ICW1)
D7 D6 D5 D4 D3 D2 D1 D0
T7 T6 T5 T4 T3 - - -
- 80x86 系统:D7
D3(T7T3)= 中断类型码的高 5 位 - 低 3 位由 8259A 根据 IR 引脚自动填入(IR0=000, …, IR7=111)
- 例:ICW2=28H → IR2 的类型码 = 2AH,IR3 的类型码 = 2BH
(3)ICW3(奇地址 A0=1,仅级联方式)
- 主片 ICW3:S7
S0 对应 IR7IR0,某位为 1 表示该 IR 引脚接有从片- 例:IR2 和 IR6 接从片 → ICW3 = 01000100B = 44H
- 从片 ICW3:ID2~ID0 表示本片接在主片的哪根 IR 上
- 例:接在主片 IR6 上 → ID2ID1ID0 = 110
(4)ICW4(奇地址 A0=1,仅 IC4=1 时)
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 SFNM BUF M/S AEOI μPM
| 位 | 名称 | 功能 |
|---|---|---|
| D0 | μPM | 1=80x86 系统;0=8080/8085 系统 |
| D1 | AEOI | 1=自动 EOI 方式;0=普通 EOI |
| D2 | M/S | 缓冲方式下:1=主片,0=从片;非缓冲时无效 |
| D3 | BUF | 1=缓冲方式;0=非缓冲方式 |
| D4 | SFNM | 1=特殊全嵌套方式;0=全嵌套方式 |
| D5~D7 | — | 固定为 0 |
6.2 初始化流程
8259A 初始化必须严格按顺序写入:
开始
↓
ICW1 (A0=0, D4=1)
↓
ICW2 (A0=1)
↓
SNGL=0? ──Y──→ ICW3 (A0=1)
↓ ↓
IC4=1? ──Y──→ ICW4 (A0=1) ←┘
↓ ↓
准备好接受中断 ←───────┘
- 单片 80x86 系统:需写入 ICW1 + ICW2 + ICW4(3 个)
- 级联 80x86 系统:需写入 ICW1 + ICW2 + ICW3 + ICW4(4 个)
- 初始化结束后才能写操作命令字 OCW
6.3 操作命令字 OCW
(1)OCW1(奇地址 A0=1)——中断屏蔽
D7 D6 D5 D4 D3 D2 D1 D0
M7 M6 M5 M4 M3 M2 M1 M0
- Mi=1 → 屏蔽 IRi;Mi=0 → 允许 IRi
- 直接写入 IMR 寄存器
- 例:写入 11110000B → 屏蔽 IR7
IR4,开放 IR3IR0
(2)OCW2(偶地址 A0=0,D4D3=00 标志)——优先级循环 + 中断结束
D7 D6 D5 D4 D3 D2 D1 D0
R SL EOI 0 0 L2 L1 L0
| 位 | 名称 | 功能 |
|---|---|---|
| D7 | R | 1=循环优先级;0=固定优先级 |
| D6 | SL | 1=L2 |
| D5 | EOI | 1=中断结束命令(清 ISR 位) |
| D4D3 | — | 固定 00(OCW2 标识) |
| D2~D0 | L2~L0 | 指定中断级(SL=1 时有效) |
R/SL/EOI 组合速查表:
| R | SL | EOI | 功能 |
|---|---|---|---|
| 0 | 0 | 1 | 普通 EOI 命令 |
| 0 | 1 | 1 | 特殊 EOI 命令 |
| 1 | 0 | 1 | 普通 EOI 循环命令 |
| 1 | 1 | 1 | 特殊 EOI 循环命令 |
| 0 | 0 | 0 | 自动 EOI 循环(复位) |
| 1 | 0 | 0 | 自动 EOI 循环(置位) |
| 1 | 1 | 0 | 置优先权命令 |
| 0 | 1 | 0 | 无操作 |
(3)OCW3(偶地址 A0=0,D4D3=01 标志)——特殊屏蔽 + 查询 + 读寄存器
D7 D6 D5 D4 D3 D2 D1 D0
0 ESMM SMM 0 1 P RR RIS
| 位 | 名称 | 功能 |
|---|---|---|
| D6D5 | ESMM/SMM | 特殊屏蔽方式:0x=不允许;10=允许但不设置;11=设置特殊屏蔽 |
| D4D3 | — | 固定 01(OCW3 标识) |
| D2 | P | 查询命令:1=发查询命令,读中断状态字 |
| D1D0 | RR/RIS | 读寄存器:10=读 IRR;11=读 ISR |
6.4 8259A 的读出操作
| 读目标 | 操作 | 端口 |
|---|---|---|
| IMR | 直接读(随时可读) | 奇地址 IN AL, 21H |
| IRR | 先写 OCW3(RR=1, RIS=0),再读 | 偶地址 |
| ISR | 先写 OCW3(RR=1, RIS=1),再读 | 偶地址 |
| 中断状态字(查询) | 先写 OCW3(P=1),再读 | 偶地址 |
读状态字格式:D7=IR(1=有中断请求,0=无),D2~D0=当前最高优先级编号。
七、8259A 应用举例
7.1 初始化编程示例
要求:80x86 系统,单片 8259A,边沿触发,中断类型码基址 08H(IR0IR7 对应 08H0FH),普通 EOI,固定优先级,端口地址 20H/21H。
; ICW1:边沿触发、单片、需 ICW4
MOV AL, 13H ; 0001 0011B
OUT 20H, AL
; ICW2:中断类型码高5位 = 08H
MOV AL, 08H
OUT 21H, AL
; ICW4:80x86系统、非缓冲、普通EOI、全嵌套
MOV AL, 0DH ; 0000 1101B → 注意: 0DH=BUF=1? 不对,应该是 01H?
; 等一下,ICW4 格式: μPM=1, AEOI=0, M/S=0, BUF=1, SFNM=0
; 原文写 0DH = 0000 1101,即 BUF=1, μPM=1, 普通EOI
OUT 21H, AL原文给出的 ICW4=0DH(缓冲方式)。若是非缓冲方式应为 01H(仅 μPM=1)。
中断结束时的 EOI 命令:
MOV AL, 20H ; OCW2 = 0010 0000B → 普通 EOI 命令
OUT 20H, AL7.2 IBM PC/XT 中的 8259A(单片)
只用一片 8259A,8 个外部中断源:
| IRQ | 中断源 | 类型码 |
|---|---|---|
| IRQ0 | 日时钟定时器 | 08H |
| IRQ1 | 键盘 | 09H |
| IRQ2 | 保留 | 0AH |
| IRQ3 | 串行通信口 1 | 0BH |
| IRQ4 | 串行通信口 2 | 0CH |
| IRQ5 | 硬磁盘 | 0DH |
| IRQ6 | 软磁盘 | 0EH |
| IRQ7 | 打印机 | 0FH |
7.3 IBM PC/AT 中的 8259A(两片级联)
两片 8259A 级联,共 15 级中断:
- 主片:IRQ0~IRQ7(其中 IRQ2 接从片)
- 从片:IRQ8~IRQ15(INT 接主片 IR2)
- 主片采用特殊全嵌套方式(支持从片内部嵌套),从片采用全嵌套方式
- 级联线 CAS0~CAS2 互连(主片输出,从片输入)
PC/AT 中断优先级队列:
IRQ0 > IRQ1 > IRQ8 > IRQ9 > IRQ10 > ... > IRQ15 > IRQ3 > IRQ4 > IRQ5 > IRQ6 > IRQ7
(主片 IR2 位置被从片的 8 个中断取代,所以从 IRQ8 开始插入到 IRQ1 和 IRQ3 之间)
7.4 中断向量的设置和获取(DOS 功能调用)
设置中断向量(AH=25H)
MOV AH, 25H
MOV AL, N ; 中断类型号
MOV DS, SEG_xxx ; 中断向量段基址
MOV DX, OFFSET_xxx ; 中断向量偏移
INT 21H取中断向量(AH=35H)
MOV AH, 35H
MOV AL, N ; 中断类型号
INT 21H
; 返回:ES:BX = 中断向量典型程序结构:替换中断向量 + 恢复
; 保存旧中断向量
MOV AH, 35H
MOV AL, N
INT 21H
PUSH ES
PUSH BX
; 设置新中断向量
PUSH DS
MOV AX, SEG INTHAND
MOV DS, AX
MOV DX, OFFSET INTHAND
MOV AH, 25H
MOV AL, N
INT 21H
POP DS
; ... 主程序 ...
; 恢复旧中断向量
POP DX
POP DS
MOV AL, N
MOV AH, 25H
INT 21H
RET
INTHAND: ; 中断服务程序
...
IRET八、关键概念速查
易混淆概念对比
| 概念 | 区别要点 |
|---|---|
| 中断响应 vs 中断处理 | 响应 = 硬件自动完成(关中断/保存断点/识别中断源);处理 = 软件执行(保护现场/服务/恢复) |
| 可屏蔽 vs 不可屏蔽 | INTR 可屏蔽(受 IF 控制);NMI 不可屏蔽(紧急事件) |
| 内部中断 vs 外部中断 | 内部 = CPU 内部事件 / INT 指令(不需 INTA);外部 = 外设请求(需 INTA 读类型码) |
| 全嵌套 vs 特殊全嵌套 | 全嵌套只允许更高级;特殊全嵌套也允许同级(主从结构主片用) |
| 普通 EOI vs 特殊 EOI | 普通 EOI 清 ISR 最高位(全嵌套用);特殊 EOI 指定位清零(非全嵌套用) |
| AEOI vs EOI | AEOI = 响应时自动清 ISR(中断处理中就清了);EOI = 服务结束时软件发命令清 |
| 电平触发 vs 边沿触发 | 电平 = 高电平请求(需及时撤销);边沿 = 上升沿触发(脉冲请求) |
8259A 命令字汇总
| 命令字 | 地址 | 标志位 | 主要功能 |
|---|---|---|---|
| ICW1 | 偶 | D4=1 | 初始化起始:触发方式/单片/级联/需 ICW4 |
| ICW2 | 奇 | 顺序 | 中断类型码高 5 位 |
| ICW3 | 奇 | 顺序 | 级联配置(主片 S 位 / 从片 ID 位) |
| ICW4 | 奇 | 顺序 | 系统模式/EOI 方式/缓冲/嵌套方式 |
| OCW1 | 奇 | — | 中断屏蔽(IMR) |
| OCW2 | 偶 | D4D3=00 | EOI + 优先级循环 |
| OCW3 | 偶 | D4D3=01 | 特殊屏蔽 + 查询 + 读寄存器 |
九、章节关联
- 前置:输入输出接口-第11章-计算机组织与系统结构(I/O 控制方式概览,DMA 与中断对比)
- 前置:微处理器的内部组成及外部功能特性-第10章-计算机组织与系统结构(CPU 引脚 INTR/NMI/INTA 信号)
- 前置:寻址方式与指令系统-第8章-计算机组织与系统结构(INT/IRET 指令、标志寄存器 IF/TF 位)
- 后续:第 14 章并行通信及接口电路 8255A、第 15 章串行通信及接口
- 跨课程:操作系统课程(二)——硬件环境与系统调用(操作系统视角的中断机制、中断向量表、系统调用实现)