首页章节笔记习题解答PDF 下载

第7章 输入/输出和中断

课件来源:以 ch7_v2020(2020版,111页)为骨架;ch7_v2008(2008版,96页)经逐页比对为2020版的子集,无独有内容,故不另引。本文页码(课件 p.N)均指2020版 Slide 编号。本章是全书命令字最多、编程考点最集中的一章:8259A 初始化/操作命令字、中断向量表计算、中断响应过程几乎必考。

课件疑点提示(详见各节「存疑」标注与习题册):p5 输出指令例误写为 IN DX,AX;p65 从片 ICW3 的二进制与十六进制不一致;p95 图与 p96 文字对「缓冲方式」矛盾;p99 例3 的 ICW2=0AH 与类型码 08H–0FH 矛盾;p66 图 ICW4 的 D1 标为「AEDI」(应为 AEOI);p100 数据段结束误写为 DATA SEGMENT;p107–111 混入了第二、三章作业答案,非本章内容。

0. 本章考点清单

考点 常见题型 重要度
8259A 初始化命令字 ICW1~ICW4 的位含义与初始化编程 填空、计算、编程 ★★★
8259A 操作命令字 OCW1~OCW3(屏蔽、EOI、优先级循环、特殊屏蔽、读状态) 选择、填空、编程 ★★★
中断向量表结构与向量地址计算(类型码×4) 计算、填空 ★★★
8086 可屏蔽中断响应的 7 个总线周期、压栈顺序、IF/TF 变化 排序、简答 ★★★
中断分类(内部/外部、NMI/INTR)与各类中断优先权次序 选择、填空 ★★★
8259A 工作方式(全嵌套/特殊全嵌套、循环、屏蔽、三种结束方式) 简答、选择 ★★★
查询传送的流程与编程(状态口检测、防死循环) 编程、简答 ★★
DMA 概念:三种基本方法、三种传送方式、DMAC 功能 选择、简答 ★★
I/O 接口与端口概念、三类信息、IN/OUT 指令 填空、选择 ★★
中断五过程、保护/恢复现场、IRET 的功能 简答、填空 ★★
8259A 级联(ICW3、扩至64级、特殊全嵌套下双 EOI) 计算、简答 ★★
PC 机中断程序编写方法(DOS 25H/35H 功能、主程序/服务程序结构) 编程 ★★
中断判优:软件查询、菊花链硬件排队 简答 ★

1. 外设接口的一般结构(7.1,p2–5)

概念精讲

简单外设接口框图:CPU 经 DB/AB/CB 接 I/O 接口内的数据口、状态口、控制口,再分别对应外设的数据、状态信息、控制信息

CPU 与外设交换的三类信息(课件 p4)

信息类型 含义 细分/说明
数据信息 交换的对象 数字量(二进制数、ASCII 码表示的数或字符);模拟量(模拟电压电流,经 A/D 转换后输入);开关量(状态量)
状态信息 外设当前所处的工作状态 如 READY、BUSY,供 CPU 查询
控制信息 CPU 发出 控制 I/O 接口的工作方式、外设的启动和停止

端口访问指令 IN/OUT(课件 p5)

IN  AL, 21H        ; 直接寻址:把 21H 端口内容读入 AL
MOV DX, 201H       ; 端口地址 > FFH 时必须用 DX 间接寻址
IN  AX, DX         ; 把 DX 所指端口内容读入 AX(16位)
OUT 32H, AL        ; 直接寻址:把 AL 内容输出到 32H 端口
MOV DX, 201H
OUT DX, AX         ; 把 AX 内容输出到 DX 所指端口

要点: - IN 的目的操作数、OUT 的源操作数只能是累加器 AL/AX;端口地址可直接给出(8位)或经 DX 间接给出(16位)(直接/间接的地址范围限制为补充常识)。 - 存疑:课件 p5 输出指令第二个例子印为「IN DX,AX」,课件原文如此,存疑:按 OUT 指令格式应为 OUT DX,AX(2008版 p5 同误)。

易错警示:接口≠端口。接口是电路整体,端口是其中可被 CPU 读写的寄存器;一个接口含多个端口。状态口只能读、控制口一般只写(补充常识)。

2. 程序控制传送方式(7.2.1,p6–14)

概念精讲:程序控制传送以 CPU 为中心,控制来自 CPU,通过预先编写好的 I/O 程序实现传送;速度较低,数据经过 CPU 内部寄存器,I/O 响应慢(课件 p6)。含三种:无条件传送、查询传送、中断传送。

2.1 无条件传送(同步传送,p7)

2.2 查询传送(异步传送,p8–11)

查询传送流程图:超时判断防死循环,读状态→BUSY?→数据交换→传送完?→复位计时器循环

2.3 中断传送(p12–13)

2.4 三种方式的共性(PIO,p14)

均需 CPU 作中介:软件上外设与内存间的数据传送靠 CPU 执行程序完成(PIO 方式);硬件上接口与存储器的读写控制信号、地址信号都由 CPU 发出。缺点:程序执行速度限定传送最大速度,约为几十 KB/s。

对比表

方式 何时传送 CPU 效率 实时性 硬件/软件 适用
无条件 执行到 I/O 指令即传 低 差 都简单 总是就绪的简单外设
查询 状态就绪才传 低(踏步) 差 软件简单、需状态口 中低速、不总就绪
中断 外设请求才传 高 好 软件复杂 随机、中低速外设

易错警示:查询方式 CPU 仍在「忙等」,并没有与外设并行;只有中断和 DMA 才实现并行。

3. DMA 传送方式(7.2.2,p15–21)

概念精讲:DMA(直接存储器存取)= 外设与内存之间直接传送数据,不需 CPU 干预、不需软件介入;控制该过程的硬件称 DMA 控制器(DMAC)。传送期间总线由 DMAC 控制(CPU 放弃总线控制权),内存/外设的地址和读写控制信号均由 DMAC 提供(课件 p15)。

3.1 DMA 操作的三种基本方法(p16–19)

方法 做法 代价/特点
周期挪用 Cycle Stealing 利用 CPU 不访问存储器的周期让 DMAC 用总线 不减慢 CPU,但需复杂时序电路,传送不连续、不规则
周期扩散 时钟电路把供 CPU 的时钟周期加宽(存储器/DMAC 时钟不变),在加宽周期内 DMA 减慢 CPU,一次只传一个字节
CPU 停机方式 DMAC 发请求,CPU 在现行总线周期结束后让地址/数据/部分控制总线呈高阻,让出总线并给响应信号;DMA 完成后 CPU 恢复控制权 降低 CPU 利用率,但最常用、最简单,大部分 DMAC 采用

(补充常识:CPU 停机方式即 HOLD/HLDA 握手过程。)

3.2 DMA 的三种传送方式(p20)

传送方式 总线占用规则
单字节传送 每个 DMA 周期只传一个字节就立即释放总线;再测 DREQ,有效才再进入 DMA 周期
成组传送 申请到总线后把一组数据传完才释放,不管中间 DREQ 是否有效
请求传送(查询传送) 成组传送,但每传一个字节后查 DREQ:有效继续传,无效挂起

3.3 DMAC 的六项基本功能(p21)

① 接收外设请求,向 CPU 发 DMA 请求;② 接到 CPU 的 DMA 响应后接管总线;③ 能寻址存储器(输出并修改地址);④ 向存储器和外设发读/写控制信号;⑤ 控制传送字节数、判断 DMA 是否结束;⑥ 传送结束后撤销 DMA 请求、释放总线,使 CPU 恢复正常工作。

易错警示:DMA 期间 CPU 只是让出总线,并不执行 I/O 程序;「CPU 停机」停的是总线使用权,不是断电停机。DMA 以总线周期为让出单位,中断响应以指令为边界,二者不要混。

4. 中断基本概念与中断过程(7.3,p22–32)

概念精讲

4.1 五个基本过程(p25–26)

中断请求 → 中断判优 → 中断响应 → 中断处理 → 中断返回。中断过程由硬件和软件共同实现。

中断处理过程:请求→判优→响应(识别中断源、禁止中断、保护断点并进入子程序)→处理(保护现场、开中断嵌套、服务、关中断、恢复现场)→返回(断点恢复)

阶段 做什么 实现者
中断请求 请求信号存于接口电路的中断请求触发器,经 INTR 或 NMI 引入 CPU(p27) 硬件
中断判优 同时请求:先服务优先级高者,同级先来先服务;非同时:低级服务程序可被高级打断=中断嵌套(p28) 硬件/软件
中断响应 每条指令执行完查询请求;有请求且 IF=1 才响应。响应后:① 自动关中断(IF 清 0);② 保存 FR 和断点(CS、IP 压栈);③ 经中断矢量查表形成入口地址(p29) 硬件
中断处理 服务程序开头 PUSH 保护现场,结束前 POP 恢复现场(p30) 软件
中断返回 返回前先开中断,再执行 IRET:弹出断点送 IP、CS 并恢复 FR(p31) 软件指令+硬件动作

4.2 中断服务子程序的标准结构(p32)

保护现场 → 开中断(STI,允许嵌套)→ 中断处理(服务主体)→ 关中断(CLI)→ 恢复现场 → 中断返回(IRET)。

易错警示:「保护断点」(CS/IP/FR 压栈)由硬件在响应时自动完成;「保护现场」(通用寄存器压栈)由服务程序用 PUSH 完成,两者不是一回事。IRET 一次弹出 IP、CS、FR 三个字,不能用 RET 代替。

5. 中断优先权排队方法(p33–35)

5.1 软件查询方式(p33)

各中断源的请求线接到一个状态端口的各位(图中端口地址 20H),同时经门电路汇总产生 INTR。CPU 响应后读该状态口,按事先排定的次序逐位查询,先查到的先服务——查询顺序即优先级。流程:保留现场 → A 申请服务? → B? → C? … → 恢复现场。

软件查询方式:8 条请求线接状态口(20H)并经门电路产生 INTR;右为按 A→B→C 次序查询的流程图

5.2 硬件优先权排队(p34–35)

菊花链逻辑电路:INTA 沿链传递,本级有请求则封锁后一级,INTR 经反相汇总

易错警示:软件查询的优先级由查询次序决定,可灵活修改但响应慢;菊花链优先级由物理位置决定,硬件简单但链长受限、故障影响后级(补充常识)。

6. 8086/8088 的中断系统(7.4,p36–52)

6.1 中断分类(p36–38)

共 256 种中断源,类型码 0~255。

中断 ─ 硬件中断(外部) ─ 非屏蔽中断 NMI(类型2)
     │                └ 可屏蔽中断 INTR(经8259A)
     └ 软件中断(内部) ─ 除法错(0)、单步(1)、断点(3)、溢出(4)、INT n

8086/8088 中断源类型:内部逻辑产生 0/1/3/4/n,NMI=2,8259A 经 INTR 送可屏蔽请求

6.2 中断向量表(p39–42)★★★

中断向量表:000 类型0除法错、004 类型1单步、008 类型2 NMI、00C 类型3断点、010 类型4溢出、014~07F 系统备用、080~3FC 用户;每入口低字 IP 高字 CS

类型码 向量地址 用途
0 00000H 除法出错
1 00004H 单步
2 00008H NMI
3 0000CH 断点
4 00010H 溢出(INTO)
5~31 00014H~0007FH 系统备用
32~255 00080H~003FFH 供用户使用

例(课件 p42):类型码 20H → 指针 = 4×20H = 0080H。若 (0080H)=10H、(0081H)=20H、(0082H)=30H、(0083H)=40H,则 IP=2010H、CS=4030H,入口地址 4030:2010H。

易错警示:① 乘 4 不是乘 2;② 低地址放 IP 不是 CS;③ 字节序是小端(10H、20H 拼成 2010H 而非 1020H);④ 向量表在内存 0 段,不是 I/O 空间。

6.3 内部中断的处理(p43–45)

类型码获取:专用中断自动形成(0、1、3、4);INT n 的类型码即指令中的 n。取得类型码后六步(p45):

① 类型码×4 → 向量表指针;② FR 入栈;③ 清 IF 和 TF(屏蔽新的 INTR 和单步);④ 保存断点:先压 CS 后压 IP;⑤ 从向量表取入口地址送 IP 和 CS;⑥ 按新地址执行服务程序。

6.4 外部中断的响应与 7 个总线周期(p46–51)★★★

序号 总线周期 动作
⑴ INTA 周期1 发第一个 INTA(通知 8259A 准备)
⑵ INTA 周期2 发第二个 INTA,外设经 D0~D7 送类型码 n;CPU 将 n 左移两位(×4)形成向量表指针存暂存器
⑶ 写周期 FR 压栈;同时 IF=0、TF=0
⑷ 写周期 CS 压栈
⑸ 写周期 IP 压栈
⑹ 读周期 从向量表取入口偏移量送 IP
⑺ 读周期 从向量表取入口段值送 CS

非屏蔽中断与软中断跳过⑴⑵,从⑶执行到⑺(5 个总线周期)(p51)。

中断响应时序:两个 INTA 周期各含 T1~T4,ALE 在 T1 有效,第二个 INTA 周期内 AD7~AD0 上出现向量类型

6.5 各类中断的优先权(p52)

从高到低:除法出错 → INT n → INTO → NMI → INTR → 单步中断。即除单步外的内部中断最高,其次非屏蔽,再次可屏蔽,单步最低。

易错警示:单步中断优先级最低(保证调试时其他中断仍能进入);INT n 与 INTO 同属内部但排在 NMI 之前;响应 INTR 的前提是 IF=1 且当前指令执行完。

7. 8259A 的结构与工作原理(7.5.1,p53–57)

7.1 功能(p53)

① 8 级优先权控制,级联可扩展至 64 级;② 每一级中断都可屏蔽或允许;③ 中断响应周期提供中断向量号(类型号);④ 工作方式可编程选择。

7.2 内部结构(p54)

部件 功能
中断请求寄存器 IRR(8位) 与 IR7~IR0 相接,某源申请则相应位置 1;最多同时接收 8 个申请
中断屏蔽寄存器 IMR(8位) 第 i 位置 1 则 IRi 被屏蔽,不能向 CPU 发 INT;软件设置;改 IMR 也可改变优先级效果
中断服务寄存器 ISR(8位) 第 i 位置 1 表示 CPU 正为 IRi 服务,保持到服务结束前用指令清除;可被 CPU 读出;多位置 1 = 发生中断嵌套
优先权电路 PR 对 IRR 中的请求判优,选出最高者,在响应周期选通送 ISR
数据总线缓冲器 8 位双向三态,接系统数据总线:收控制字、发类型码和状态
读/写逻辑 接收 CPU 读/写命令;CS 与 A0 决定访问哪个寄存器
级联缓冲/比较器 多片连接,8 级扩到 64 级

7.3 引脚(p55)

8259A 引脚图(28脚)与引脚功能表:D7~D0 双向数据、RD/WR 读写、A0 命令选择、CS 片选、CAS2~0 级联、SP/EN 双功能、INT 输出、INTA 输入、IR7~0 请求输入

关键引脚:IR0~IR7(请求输入)、INT(接 CPU 的 INTR)、INTA(接 CPU 响应信号)、A0(区分奇/偶端口)、CAS2~CAS0(级联线)、SP/EN 双功能:缓冲方式下作输出控制缓冲器传送方向;非缓冲方式下作输入规定主片(=1)/从片(=0)(p55)。

7.4 工作原理(p56–57)

通电后先初始化(CPU 写命令字规定工作状态)。处理过程: ① IR0~IR7 某线变高 → IRR 相应位置 1;② 至少一条请求未被屏蔽 → INT 引脚向 CPU 发请求;③ CPU 开中断则当前指令执行完后以 INTA 响应;④ 8259A 接到第一个 INTA:最高优先权的 ISR 位置 1、相应 IRR 位复位,此周期不向数据总线送内容;⑤ 第二个 INTA 期间向数据总线送 8 位类型码,CPU 以类型码×4 查向量表取入口;⑥ 若 AEOI 方式,第二个 INTA 结束时 ISR 相应位自动复位;否则直到服务程序发 EOI 命令才复位。

易错警示:IRR=「在排队」,ISR=「正在服务」,IMR=「不让进」;第一个 INTA 不送类型码,第二个才送。

8. 8259A 的命令字(7.5.2,p58–79)★★★

编程分两部分:初始化编程写 ICW1~ICW4(2~4 字节,写入后工作中不再改变);工作方式编程写 OCW1~OCW3(初始化后任何时间可写、可多次改写)(p58–59)。

8.1 初始化顺序(p61)

写 ICW 流程:ICW1 写偶地址 → ICW2 写奇地址 → 级联? 是则写 ICW3(奇) → 要 ICW4? 是则写 ICW4(奇) → 初始化完

ICW1 写偶地址(A0=0),ICW2/ICW3/ICW4 写奇地址(A0=1);单片(SNGL=1)跳过 ICW3;IC4=0 跳过 ICW4(8086 系统必须写 ICW4)。

8.2 ICW1——芯片控制字(p62,A0=0)

位 名称 含义
D7 D6 D5 — 0,对 8086/8088 无效
D4 识别位 1(ICW1 标志)
D3 LTIM 1=电平触发,0=边沿触发
D2 — 0(服务程序间隔 4/8,对 8086 无效)
D1 SNGL 1=单片,0=多片级联
D0 IC4 1=需要 ICW4,0=不需要

例:边沿触发、单片、需 ICW4 → 00010011B = 13H;电平触发其余同 → 00011011B = 1BH。

8.3 ICW2——中断类型码字(p63,A0=1)

D7~D3 = T7~T3,定义类型码高 5 位(用户决定);D2~D0 由中断源引脚序号自动填入(IR0=000 … IR7=111)。故 IRi 的类型码 = 高5位拼接 i 的三位二进制。例:高5位=00001 → IR0~IR7 类型码 08H~0FH。

8.4 ICW3——级联控制字(p64–65,A0=1)

8.5 ICW4——方式控制字(p66,A0=1,8086 系统必写)

ICW4 格式:D4=SFNM 特殊全嵌套、D3=BUF 缓冲、D2=M/S 主从、D1=AEOI 自动结束、D0=1 选 8086/8088

位 名称 1 0
D7 D6 D5 — 0 0
D4 SFNM 特殊全嵌套 普通全嵌套
D3 BUF 缓冲方式 非缓冲方式
D2 M/S 主片 从片(缓冲方式下有效)
D1 AEOI 自动 EOI 正常 EOI
D0 μPM 8086/8088 8080/8085

(存疑:p66 图中 D1 印为「AEDI」,应为 AEOI。)例:全嵌套+缓冲+主片+正常EOI+8086 = 00001101B = 0DH;非缓冲其余同 = 01H。

8.6 OCW 的端口规定与识别(p67、p79)

8.7 OCW1——屏蔽字(p69,A0=1)

即 IMR 的内容:Mi=1 屏蔽 IRi,Mi=0 允许。例:只允许 IR0、IR1、IR4 → 11101100B = 0ECH(p97)。

8.8 OCW2——优先级循环与中断结束(p70–74,A0=0)

OCW2 格式:D7=R 循环、D6=SL 指定有效、D5=EOI 发结束命令、D4D3=00、D2D1D0=L2L1L0 中断源选择

R SL EOI 八种组合(p71):

R SL EOI 功能
0 0 1 一般 EOI(全嵌套/固定优先级下清最高 ISR 位)
0 1 1 特殊 EOI:按 L2~L0 复位指定 ISR 位
1 0 1 一般 EOI + 优先级自动循环
1 0 0 设置「自动 EOI 时循环」(配合 AEOI)
0 0 0 取消自动 EOI 循环(恢复固定优先级)
1 1 1 特殊 EOI + 特殊循环(L2~L0 设为最低优先级)
1 1 0 特殊循环:L2~L0 设为最低优先级(不发 EOI)
0 1 0 无意义

典型命令字(p72–74): - 一般 EOI:MOV AL,20H / OUT 20H,AL / IRET(00100000B)。 - 特殊 EOI 清 ISR4:01100100B = 64H(L=100)。 - 自动循环+EOI:当前 IR4 服务完,MOV AL,0A0H / OUT 20H,AL(10100000B)→ ISR4 清 0,优先级变为 IR5 IR6 IR7 … IR4。 - 特殊循环+EOI:MOV AL,0E3H / OUT 20H,AL(11100011B,L=011)→ ISR3 清 0 且 IR3 降为最低。

8.9 OCW3——状态操作字(p75–78,A0=0)

OCW3 格式:D6=ESMM、D5=SMM 特殊屏蔽控制,D3=1 识别,D2=P 查询,D1=RR、D0=RIS 读寄存器选择

位段 取值与功能
D6 D5(ESMM SMM) 0×=无作用;10=撤销特殊屏蔽;11=设置特殊屏蔽
D2(P) 1=查询命令;0=非查询
D1 D0(RR RIS) 0×=无作用;10=下一个 RD 读 IRR;11=下一个 RD 读 ISR

读状态示例(p78):读 ISR → MOV AL,0BH / OUT 20H,AL / NOP / IN AL,20H;读 IRR → MOV AL,0AH / OUT 20H,AL / NOP / IN AL,20H。读 IMR 直接对奇地址 IN(p93)。

特殊屏蔽示例(p76–77):正为 IR3 服务又想响应更低级中断 → CLI → OCW3=68H(D6D5=11)写 20H → 读 IMR、OR AL,08H 写 21H 屏蔽 IR3 → STI;退出时 CLI → 读 IMR、AND AL,0F7H 写 21H 解除屏蔽 → OCW3=48H(D6D5=10)写 20H → STI → … → IRET。

易错警示:OCW2/OCW3 靠 D3 区分、与 ICW1 靠 D4 区分;写错端口(奇偶)命令字无效。一般 EOI=20H 只清「当前最高」的 ISR 位,不指定级别。

9. 8259A 的工作方式(7.5.3,p80–93)

9.1 中断嵌套方式(p80–83)

9.2 优先级循环方式(p84–85)

9.3 中断屏蔽方式(p86–88)

9.4 程序查询方式(p89)

一般用于多于 64 级中断的场合。写 OCW3 令 P=1(D2=1)发查询命令,随后一条 IN(偶地址)读查询字:D7=1 有中断请求、=0 无;D2D1D0(W2W1W0)= 当前请求中级别最高者的编号。8259A 内部仍做 8 级判优与屏蔽管理。

9.5 中断结束方式(p90–92)

方式 设置 ISR 清零时机 适用
自动结束 AEOI ICW4 D1=1 第二个 INTA 结束时硬件自动清 不要求嵌套
正常(一般)EOI ICW4 D1=0;服务程序发 OCW2=20H(D7D6D5=001) 执行 EOI 命令时清最高 ISR 位 只能用于全嵌套;级联发 2 个
特殊 EOI ICW4 D1=0;OCW2 D7D6D5=011 或 111,L2~L0 指定级别 清指定 ISR 位 任何情况(含循环方式)

一般 EOI 不能用于循环方式的原因:它结束的是「尚未处理完的级别最高者」,优先级一旦循环改变就会清错位、使中断过程混乱(p91)。

9.6 读 8259A 状态(p93)

先写 OCW3:RR=1,RIS=0(D1D0=10)→ 再 IN 偶地址读 IRR;RR=1,RIS=1(D1D0=11)→ 读 ISR;直接 IN 奇地址读 IMR。

易错警示:AEOI 在第二个 INTA 就清 ISR,故服务期间 8259A 认为「无人在服务」,低级中断可长驱直入 → 不能嵌套。特殊屏蔽「屏蔽本级却放低级进来」靠的是 ISR 本级位被清 0,而不是仅靠 IMR。

10. 级联系统与编程实例(7.5.4–7.5.5,p94–106)

10.1 主从式级联(p94)

中断源多于 8 个必须级联:一片主 8259A + 若干从片,最多 1 主 8 从 = 64 级。从片 INT 接主片某 IRi;主片 INT 接 CPU INTR;CAS2~CAS0 级联线并联;缓冲方式下主片 SP/EN 作输出驱动总线缓冲器,从片 SP/EN 接地表示从片。

主从中断系统:主片 INT→CPU INTR,从片 INT→主片 IRi,CAS0~2 并联,地址译码产生 CS

10.2 PC/XT 的 8259A 连接与初始化(例6-1,p95–97)

PC/XT 8259A 硬件连接:IRQ0 日时钟、IRQ1 键盘、IRQ2 保留、IRQ3 通信、IRQ4 串行口、IRQ5 硬盘、IRQ6 软盘、IRQ7 打印机;SP/EN 接 +5V;INT→CPU INTR

条件:单片、端口 20H/21H、边沿触发、缓冲方式、正常 EOI、全嵌套、类型码 08H–0FH。

MOV AL, 13H      ; ICW1: 00010011 边沿触发、单片、需ICW4
OUT 20H, AL      ; 偶地址
MOV AL, 08H      ; ICW2: 高5位00001 → IR0~IR7 = 08H~0FH
OUT 21H, AL      ; 奇地址
MOV AL, 0DH      ; ICW4: 00001101 全嵌套、缓冲、主片、正常EOI、8086
OUT 21H, AL

初始化后:允许时钟(IR0)、键盘(IR1)、COM1(IR4) → OCW1 = 11101100B = 0ECH 写 21H;正常 EOI 故服务程序返回前 MOV AL,20H / OUT 20H,AL / IRET(p97)。

存疑:p95 图中 SP/EN 接 +5V 属非缓冲方式主片接法(对应 ICW4 应为 01H),而 p96 文字与命令字按缓冲方式(0DH)给出,图与文矛盾;课件原文如此,存疑。答题以课件文字要求为准。

10.3 应用实例(p98–104)

例1(p98):端口 1CE0H/1CE2H,电平触发、单片、类型码高5位 00010、源接 IR3、非特殊全嵌套、非自动结束、非缓冲 → ICW1=00011011B=1BH,ICW2=00010011B(高5位 00010,低3位任意),ICW4=00000001B=01H;单片无 ICW3。代码见习题册题10。

例3(p99–104):PC/XT,20H/21H,边沿、缓冲、非自动结束、全嵌套,类型码 08H–0FH;利用 IR2 中断 10 次、每次输出 'ABC'。命令字:ICW1=13H、ICW2=0AH(存疑,见下)、ICW4=0DH、OCW1=FBH(只开 IR2)、OCW2=20H。主程序:初始化 → CLI → 用 DOS 35H 功能取原 0AH 号向量存 M2(段)/M3(偏移) → 用 25H 功能装入新向量 INT2 → 读 IMR AND AL,0FBH 开放 IR2 → BX=10 → 循环 STI / HLT / DEC BX / JNZ → 恢复原向量 → 4C00H 退出。服务程序 INT2:显示 'ABC$'(AH=09H)→ 发 EOI 20H → IRET。

存疑:课件给 ICW2=0AH 与「类型码 08H–0FH」矛盾:若类型码 08H–0FH 则 ICW2 应为 08H、IR2 类型码=0AH(与程序用 350AH/250AH 一致);若 ICW2=0AH 则 IR2 类型码=0CH,程序应改用 0CH。课件原文如此,存疑。另 p100 数据段结束误印为第二个 DATA SEGMENT,应为 DATA ENDS。p99 的「例2 P203」仅指教材页码,课件未给题面。

10.4 PC 机中断程序编写方法小结(p105–106)

DOS 功能(INT 21H) 入口 出口
取中断向量 AH=35H AL=类型号 ES:BX=入口地址
置中断向量 AH=25H AL=类型号,DS:DX=入口地址 —

易错警示:改向量前必须保存原向量、退出前恢复;开放设备中断是清 IMR 对应位(AND 掩码),不是置 1;HLT 前必须 STI,否则睡死。

11. 易错点与高频陷阱汇总

  1. IN/OUT 的数据操作数只能是 AL/AX;端口 >FFH 必须 DX 间接;课件 p5 的「IN DX,AX」是笔误,应为 OUT。
  2. 向量表每入口 4 字节:低字 IP、高字 CS,字节小端;入口写成 CS:IP。
  3. 向量地址 = 类型码×4(左移2位),不是×2;类型码先化成十进制或直接十六进制乘 4。
  4. 响应时压栈顺序 FR→CS→IP;IRET 反序弹出三者;RET 只弹 IP(或 IP+CS),不能用于中断返回。
  5. IF 只屏蔽 INTR;NMI 与内部中断(除单步)不受 IF 影响;单步受 TF 控制且优先级最低。
  6. 中断响应在一条指令执行完后;DMA 让总线在一个总线周期结束后——两个边界别混。
  7. 8259A 端口:ICW1/OCW2/OCW3 写偶地址,ICW2~ICW4/OCW1 写奇地址;读 IMR 用奇地址 IN。
  8. IMR/OCW1 中 1=屏蔽、0=允许;开放某级用 AND 清位,屏蔽用 OR 置位。
  9. 一般 EOI(20H)只适用于全嵌套;循环方式必须用特殊 EOI 或带循环的 EOI,否则清错 ISR 位。
  10. AEOI 在第二个 INTA 结束即清 ISR → 无法嵌套;需要嵌套就用正常 EOI 并在 IRET 前发命令。
  11. 特殊屏蔽两步缺一不可:先 OCW3=68H 再 OCW1 屏蔽本级;退出先解屏蔽再 OCW3=48H。
  12. IRR=等待、ISR=在服务、IMR=屏蔽;ISR 多位为 1 即嵌套;第一个 INTA 不送类型码。
  13. 级联特殊全嵌套下从片服务结束:查从片 ISR=0 才发两个 EOI(先从而主);只发一个主片 ISR 不清。
  14. 查询方式要加超时判断防死循环;每轮传送后复位计时器。
  15. 单片 8259A 不写 ICW3;8086 系统 ICW4 必写且 D0=1;ICW2 低 3 位写了也被硬件忽略。
  16. 全嵌套屏蔽「同级+低级」;特殊全嵌套主片允许同一从片内更高级(看似同级)上来。

12. 典型例题精讲

例A(向量表计算,课件 p42 改编):某系统 1CH 号中断服务程序入口为 F000:1234H,问向量表中哪四个单元存什么? 解:指针 = 1CH×4 = 28×4 = 112 = 0070H。低字 IP=1234H → (0070H)=34H、(0071H)=12H;高字 CS=F000H → (0072H)=00H、(0073H)=F0H。反向题型(给字节求入口)即课件 p42 原题:20H→0080H,字节 10H,20H,30H,40H → IP=2010H、CS=4030H → 4030:2010H。教学要点:先乘 4 定地址,再「低低高高、字节小端」拼字。

例B(8259A 初始化推导,课件 p98 例1):端口 1CE0H/1CE2H、电平触发、单片、类型码高5位 00010、非特殊全嵌套、非自动结束、非缓冲。 解:ICW1:D4=1、LTIM=1、SNGL=1、IC4=1 → 00011011B=1BH,写 1CE0H;ICW2:高5位 00010 → 写 00010000B=10H 即可(课件写 00010011B,低3位无关),写 1CE2H;单片跳过 ICW3;ICW4:SFNM=0、BUF=0、AEOI=0、μPM=1 → 00000001B=01H,写 1CE2H。教学要点:把题目每个形容词翻译成一个 bit,再拼字节;偶奇端口交替。

例C(OCW2 特殊循环,课件 p85):要求设 IR5 为最低优先级,写出 OCW2 并说明此后优先级次序。 解:特殊循环 R=1、SL=1、不发 EOI → EOI=0;L2L1L0=101(IR5)。OCW2 = 110 00 101B = C5H,写偶地址。IR5 最低 → 其次序循环为 IR6 最高,IR6 IR7 IR0 IR1 IR2 IR3 IR4 IR5(高→低)。教学要点:L 码指定的是最低优先级,最高是它的下一个(模8加1)。

附:本章速查表

公式 - 中断向量地址指针 = 4 × 中断类型码;入口 = (指针+2 字):(指针字),即 CS:IP。 - 向量表范围 00000H~003FFH,1KB,256 入口×4B。 - IRi 类型码 = ICW2 高5位 ‖ i(3位)。

8086 专用向量:0→0000H 除法错;1→0004H 单步;2→0008H NMI;3→000CH 断点;4→0010H 溢出。 优先权:除法错 > INT n > INTO > NMI > INTR > 单步。 可屏蔽响应 7 周期:INTA1、INTA2(取n×4)、写FR(IF=TF=0)、写CS、写IP、读IP、读CS;NMI/软中断省前两个。

8259A 命令字速查

字 端口 关键位 常用值
ICW1 偶 D4=1;D3 LTIM;D1 SNGL;D0 IC4 13H 边沿单片;1BH 电平单片
ICW2 奇 D7-D3 类型码高5位 08H→08H-0FH
ICW3 奇 主:接从片的 IR 位=1;从:D2-D0=主片 IR 号 主20H/从05H(IR5)
ICW4 奇 D4 SFNM;D3 BUF;D2 M/S;D1 AEOI;D0=1 01H 非缓冲;0DH 缓冲主片
OCW1 奇 =IMR,1 屏蔽 0ECH 开 IR0/1/4;0FBH 只开 IR2
OCW2 偶 R SL EOI + L2L0 20H 一般EOI;64H 特殊EOI清ISR4;0A0H 循环EOI;0E3H 特殊循环EOI清ISR3;0C5H 设IR5最低
OCW3 偶 D6D5 特殊屏蔽;D2 P;D1D0 RR RIS 68H 设特殊屏蔽;48H 撤销;0AH 读IRR;0BH 读ISR;0CH 查询

识别位:A0=0 时 D4=1→ICW1;D4=0,D3=0→OCW2;D4=0,D3=1→OCW3。 PC/XT IRQ:0 日时钟、1 键盘、2 保留、3 通信、4 串行口(COM1)、5 硬盘、6 软盘、7 打印机;端口 20H/21H,类型码 08H–0FH。 DOS 向量功能:35H 取(AL=类型,出 ES:BX);25H 置(AL=类型,入 DS:DX)。 服务程序骨架:PUSH 保护现场 → STI → 服务 → 发 EOI(20H→偶口) → CLI → POP 恢复现场 → IRET。