Ch.6 输入输出和中断技术
? 本章内容
? 基本概念
? I/O端口的编址
? 输入输出的基本方法,无条件, 查询, 中断, DMA
? 中断
? 中断基本概念
? 8086/8088中断系统
? 8259中断控制器 *
? DMA*
? DMA的基本概念
? DMA工作过程
? DMA的三种传输方式
6.1 输入 /输出接口( I/O接口)
? 6.1.1 概述
? 什么是 I/O接口?
把外设连接到总线上的一组逻辑电路的总称。实现外设与主机之
间的 信息交换。
? I/O接口要解决的问题
? 速度匹配 (Buffer)
? 信号电平和驱动能力 (电平转换器、驱动器 )
? 信号形式匹配 (A/D,D/A)
? 信息格式 (字节流、块、数据包、帧 )
? 时序匹配 (定时关系 )
? 总线隔离 (三态门 )
? I/O接口的功能
? I/O地址译码与设备选择
? 把选中的与总线相接,未选中的与总线隔离(高阻态)
? 数据的缓冲与暂存
? 缓解接口与 CPU工作速度的差异
? 对外设进行监测、控制与管理,中断处理
? 信号电平与类型的转换
? 形式、格式、电平、功率、码制等
? 6.1.2 I/O接口的编址方式
? I/O端口:
I/O信息的三种类型:数据、命令、状态。传送
这三类信息的通道分别称为:数据端口 (I,O)、
命令端口 (O)、状态端口 (I)。
? 不同外设具有的端口数各不相同,计算机中为每
一个端口都赋予一个惟一编号 ——称为端口地址
(或端口号 )。
? 端口有两种编址方式:统一编址和独立编址。
? 1,统一编址
? 把外设接口与内存统一进行
编址。各占据统一地址空间
的不同部分。
? 优点
? 指令统一,灵活;
? 访问控制信号统一,使用同一
组的地址 /控制信号。
? 缺点
? 内存可用地址空间减小
0
地址空间 (共 1MB)
内存地址
(960KB)
I/O地址
(64KB)
FFFFFH
EFFFFH
F0000H
? 2,独立编址
? 外设地址空间和内存地址空间 相互独立 。
? 优点:内存地址空间不受 I/O编址的影响
? 缺点,I/O指令功能较弱,使用不同的读写控制信号
00000H
内存地址空间
内存空间
(1MB)
I/O空间
(64KB)
FFFFH
FFFFFH
I/O地址空间
0000H
? 例如,8088/8086系统
8
0
8
8

线
A19-A0
A9-A0
MEMR,MEMW
IOR,IOW, AEN
存储器访问
I/O访问
? 8088/8086 CPU的 I/O编址方式
? 采用 I/O独立编址方式 (但地址线与存储器共用 )
? 地址线上的地址信号用 来区分:
? 时为 I/O地址
? I/O操作只使用 20根地址线中的 16根,A15 ~ A0
? 可 寻址的 I/O端口数为 64K(65536)个
? I/O地址范围为 0~ FFFFH
? IBM PC只使用了 1024个 I/O地址 (0~ 3FFH)
IO /M =1
IO/M
? 6.1.3 I/O端口地址的译码
?,, A15 ~ A0
? OUT指令将使总线的 信号有效
? IN指令将使总线的 信号有效
? 当接口只有一个端口时,16位地址线 一般 应 全部参与译
码,译码输出直接选择该端口;当接口具有多个端口时,
则 16位地址线的高位 参与译码(决定接口的基地址),
而低位则用于确定要访问哪一个端口。
例如,某外设接口有 4个端口,地址为 2F0H~ 2F3H,
则其基地址为 2F0H,由 A15~ A2译码得到,而 A1,A0用
来确定 4个端口中的某一个。
IOR
IOW
IOW IOR
? 6.1.4 I/O数据的传送方式
? 并行
? 一个数据单位 (通常为字节 )的各位同时传送
? 速度快、距离短、成本高
? 例,PC机的并行接口 (通常用于连接打印机 )
? 串行
? 数据 按位 进行传送
? 速度慢、距离远、成本低
? 例,PC机的串行接口 (通常用于串行通信 )
? 6.2.1 接口电路的基本结构
6.2 简单接口电路
数据线
控制线
状态线
DB
CB
AB
数据输入寄存器
( or 三态门)
数据输出寄存器
(锁存器)
状态寄存器
( or 三态门)
命令寄存器
译码
电路
控制
逻辑






? 数据输入 /输出寄存器 ——暂存输入 /输出的
数据
? 命令寄存器 ——存放控制命令,用来设定接
口功能、工作参数和工作方式。
? 状态寄存器 ——保存外设当前状态,以供
CPU读取。
简单接口电路
? 数据输入接口
? 必须具有三态输出能力,以便与总线挂接
? 外设有数据保持能力时 —可用三态门实现
? 外设无数据保持能力时 —用三态输出的锁存器实

? 数据输出接口
? 常用锁存器实现
? 三态门:高电平、低电平,高阻态
? 通常一个器件中包含 8个三态门
? 常用芯片,74LS244(教材图 6.3)
? 应用例子:开关接口
? 工作波形图如下:
A0~A15
IOR#
译码输出
D0~D7 开关状态
地址有效
简单的输入接口举例
K 6
K 7
+ 5 V
I 0
I 3
D 0 - D 7
D O 0
D O 7
~
7 4 L S 2 4 4
E 1
E 2
≥ 1& A 2
A 3
A 4
A 5
A 6
A 7
A 8
A 9
A 1 0
A 1 1
A 1 2
A 1 3
A 1 4
A 1 5
I O R



线


≥ 1
K 5
K 4
K 3
K 2
K 1
K 0
I 1
I 2
I 4
I 5
I 6
I 7
?接口电路图如下:
83FCH
~ 83FFH
译码器
? 锁存器:由 D触发器构成
? 通常一个器件包含 8个 D触发器
? 常用芯片,(教材图 6.5、图 6.6)
? 74LS273
? 74LS374(具有三态输出的锁存器,内部结构见图 6.8)
? 应用例子:发光二极管接口
简单的输出接口举例



=1
=1
..
.
..
.
..
.
+5V
RD0
|D
7
CP
Q0
Q7
..
.
D0~ D7
A0~ A15
IOW#
74LS273
R
输入 /输出接口综合应用例子
? 根据开关状态在 7段数码管上显示数字或符号
? 共阳极 7段数码管结构见教材图 6.10
? 用 74LS273作为输出接口,把数据送到 7段数码管
? 74LS273的地址假设为 F0H
? 用 74LS244作为输入口,读入开关 K0~ K3的状态
? 74LS244的地址假设为 F1H
? 当开关的状态分别为 0000~ 1111时,在 7段数码管上对
应显示 ’0’~ ’F’
? (7段码表见下页 )
符号 形状 7段码.gfedcba 符号 形状 7段码.gfedcba
’0’ 00111111 ’8’ 01111111
’1’ 00000110 ’9’ 01100111
’2’ 01011011 ’A’ 01110111
’3’ 01001111 ’B’ 01111100
’4’ 01100110 ’C’ 00111001
’5’ 01101101 ’D’ 01011110
’6’ 01111101 ’E’ 01111001
’7’ 00000111 ’F’ 01110001
O1 I1
O2 I2
O3 I3
O4 I4
#E1
K0~ K3
+5V
G
G2A
G2B
C
B
A
≥1
74LS244
D0 Q0
| Q1
D7 Q2
Q3
Q4
CP Q5
Q6
Q7
a
b
c
d
e
f
g
DP
7406
8个
反相器
74LS273 Rx8
≥1
74LS138
D0~ D7
IOW#
IOR#
Y0
Y1
F0H = 0000 0000 1111 0000
F1H = 0000 0000 1111 0001
&
≥ 1
A7~ A4
A15~ A8
A3
A2
A1
A0
D0
D1
D2
D3
译码电路
相应程序段如下,
……
Seg7 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,67H,77H,7CH,39H,5EH,79H,71H
……
LEA BX,Seg7 ;取 7段码表基地址
MOV AH,0
GO,MOV DX,0F1H ;开关接口的地址为 F1H
IN AL,DX ;读入开关状态
AND AL,0FH ;保留低 4位
MOV SI,AX ;作为 7段码表的表内位移量
MOV AL,[ BX+SI] ;取 7段码
MOV DX,0F0H ; 7段数码管接口的地址为 F0H
OUT DX,AL
JMP GO
6.3 输入输出的 控制 方式
? 主机与外设之间数据传送的控制方式有以下
四种:
? 无条件传送
? 查询式传送
? 中断方式传送
? 直接存储器存取 (DMA,Direct Memory Access)
6.3.1 无条件传送方式
? 适用于 总是处于准备好状态 的外设
? 以下外设可采用无条件传送方式:
? 开关
? 发光器件 (如发光二极管,7段数码管、灯泡等 )
? 继电器
? 步进电机
? 优点:软件及接口硬件简单
? 缺点:只适用于简单外设,适应范围较窄
6.3.2 查询方式传送
? 适用于外设并不总是准备好,而且对传送速
率、传送效率要求不高的场合。
? CPU在与外设交换数据前必须询问外设状
态 ——“你准备好没有?,
? 对外设的要求:应提供设备状态信息
? 对接口的要求:需要提供状态端口
? 优点:软件比较简单
? 缺点,CPU效率低,数据传送的实时性差,
速度较慢
查询方式的流程图
超时?
READY?
与外设进
行数据交换
超时错读入并测试外设状态
Y
N
Y
N
传送完?
防止死循环
复位计时器
N
Y
注:多个外设时,查
询流程见教材图 6.15
例:用查询方式进行输出
?外设状态端口地址为 3FBH,第 5位 (bit5)为状态标志
( =1忙,=0准备好)
?外设数据端口地址为 3F8H,写入数据会使状态标志
置 1 ;外设把数据读走后又把它置 0。
试画出其电路图。(电路图见下页)
D5
D7-D0
A9
|
A3
≥1
&
A15
|
A10
≥1
IOW
D7-D0
3F8H


D7
D6
D5
D4
D3
D2
D1
D0
BUSY
CP
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
状态端口
G
G2A
G2B
C
B
A
A2
A1
A0
74LS138
Y0
≥1
IOR
Y3
OE
74LS374
CP
Q
Q
DS
STROBE
3FBH
程序段?
6.3.3 中断方式 传送
? CPU无需循环查询外设状态,而是外部设备
在需要进行数据传送时才中断 CPU正在进行
的工作,让 CPU来为其服务。即 CPU在没有
外设请求时可以去做更重要的事情,有请求
时才去传输数据,从而大大提高了 CPU的利
用率。
? 优点,CPU效率高,实时性好,速度快。
? 缺点:程序编制较为复杂。
6.3.4 DMA传输
? 前面三种 I/O方式都需要 CPU作为中介:
外设 CPU 内存
两个含义:
1)软件:外设与内存之间的数据传送是通过 CPU
执行程序来完成的( PIO方式);
2)硬件,I/O接口和存储器的读写控制信号、地
址信号都是由 CPU发出的(总线由 CPU控制)。
? 缺点:程序的执行速度限定了传送的最大速
度(约为几十 KB/秒) —解决,DMA传输
? DMA传输,
外设 内存
? 外设直接与存储器进行数据交换, CPU不再担
当数据传输的中介者;
? 总线由 DMA控制器( DMAC)进行控制( CPU
要放弃总线控制权),内存 /外设的地址和读写
控制信号均由 DMAC提供。
? 优点:数据传输 由 DMA硬件来控制,数据 直
接在内存和外设之间交换,可以达到很高的
传输速率(可达几 MB/秒)
几个基本概念
? 总线控制权,mater,slave
? DMAC编程周期,slave
? DMAC控制总线进行数据传输周期,master
? DMA的数据传输形式,
基本的,MEM——I/O
扩充的,MEM——MEM
I/O ——I/O
DMA传送原理示意 图

系统总线
CPU DMAC
存储器
外设接口
AEN IO
W
ME
MW
ME
MR
IO
R
ME
MW
ME
MR
IO
W
IO
R
AE
N
HOLD
HLDA
DRQ
DACK

③ ④

AE
N IOW IOR
ME
MW
ME
MR
① 外设发出 DMA请求
② DMAC向 CPU申请总线
③ CPU完成当前总线周期后 响应,并释放总线控制权
④ DMAC得到总线控制权,并发出 DMA响应信号
⑤ 由 DMAC发出各种控制信号,控制外设与存储器之
间的数据传送
⑥ 数据传送完后,DMAC撤销 HOLD信号
⑦ CPU释放 HLDA信号,并重新控制总线


? DMA控制器的工作过程
1)当外设准备好,可以进行 DMA传送时,外设向
DMA控制器发出, DMA传送请求, 信号( DRQ);
2) DMA控制器收到请求后,向 CPU发出, 总线
请求, 信号 HOLD,表示希望占用总线;
3) CPU在完成当前总线周期后会立即对 HOLD信
号进行响应。响应包括两个动作:一是 CPU将数据
总线、地址总线和相应的控制信号线均置为高阻态
,由此放弃对总线的控制权。另一方面,CPU向
DMA控制器发出, 总线响应, 信号( HLDA)。
4) DMA控制器收到 HLDA信号后,就开始控制总
线,并向外设发出 DMA响应信号 DACK;
? DMA控制器的工作过程(续)
5) DMA控制器送出地址信号和相应的控制信号,
实现外设与内存或内存与内存之间的直接数据传送;
例如,向 I/O接口发出读信号,同时往地址总线上发
出存储器的地址和存储器写信号和 AEN信号,即可从
外设向内存传送一个字节。
6) DMA控制器自动修改地址和字节计数器,并判
断是否需要重复传送操作。当规定的数据传送完后,
DMA控制器就撤销发往 CPU的 HOLD信号。 CPU检
测到 HOLD失效后,紧接着撤销 HLDA信号,并在下
一时钟周期重新开始控制总线。
? DMA的三种传输方式,
? 连续传送(块传送)
? DMAC申请到总线后,将一块数据传送完后才释放总
线,而不管中间 DREQ是否有效。
? 单次传送(每次传送一个字节)
? 每个 DMA周期只传送一个字节就立即释放总线。
? 按需传送(猝发传送)
? 只要 I/O接口的数据缓冲可用,就进行传送。
(注,I/O接口需要有一定大小的 FIFO缓冲 )
Y
N
允许 DMA
DMA请求?
DMAC请求总线
CPU响应,DMAC获总线控制权
DMA传送一个字节
块结束?
地址增量,计数器减量
DMAC释放总线
Y
? 数据块传送
N
N
Y
N
允许 DMA
DMAC请求总线
CPU响应,DMAC获总线控制权
DMA传送一个数据
块结束?
释放总线至少一个总线周期
地址增量,计数器减量
DMAC释放总线
Y
? 每次传送一个字节
测试 I/O的 DREQ
DMA请求?
N
Y
CPU响应,DMAC获总线控制权
DMA传送一个字节
块结束?
测试 I/O的 DREQ
有效?
地址增量,计数器减量
释放总线,请求中断无效,释放总线
允许 DMA
DMA请求?
DMAC请求总线
? 按需传送
Y
N
Y
N
一个总线周期
T
DMAC控制总线,共传送 n个数据
DMA1 DMA2 DMAn
CPU重新控制总线CPU对总线控制
连续传送
T
DMA共传送 n个数据
DMA1 DMA2 DMAn
单次传送
DMA3
T按需传送
DMA传送 k个数据 DMA传送 n-k个数据
FIFO可用 FIFO满 FIFO可用 FIFO满
图例:
DMA传输方式示意图,
6.4 中断技术
? 6.4.1 中断的基本概念
? 什么是中断?
? 与生活场景的比较
正在看书
电话铃响
接电话
继续看书
执行程序
事件发生
事件处理
继续执行程序
中断处理
中断请求及响应
实际场景 计算机
中断返回
中断的定义
? CPU执行程序时,由于发生了某种随机
的事件 (外部或内部 ),引起 CPU暂时中
断正在运行的程序,转去执行一段特殊
的服务程序 (称为中断服务程序或中断处
理程序 ),以处理该事件,该事件处理完
后又返回被中断的程序继续执行,这一
过程称为中断。
中断源
? 引起 CPU中断的事件 ——中断源。例如:
? 外设 ——请求输入输出数据,报告故障等
? 事件 ——掉电、硬件故障、软件错误、非法操作、定时
时间到等
? 中断源分为:外部中断、内部中断
? 内部中断,CPU内部执行程序时自身产生的中断
? 外部中断,CPU以外的设备、部件产生的中断
? 8086/8088的外部中断信号,INTR,NMI
? INTR——可屏蔽中断请求,高电平有效,受 IF标志的控
制。 IF=1时,执行完当前指令后 CPU对它作出响应。
? NMI——非屏蔽中断请求,上升沿有效,任何时候 CPU
都要响应此中断请求信号。
为何计算机中要引入中断?
? 提高数据传输率;
? 避免了 CPU不断检测外设状态的过程,提
高了 CPU的利用率。
? 实现对特殊事件的实时响应。如多任务系
统操作系统中:
? 缺页中断
? 设备中断
? 各类异常
? 实时钟,。。。等
中断过程
? 五个步骤:
? 中断请求
? 中断判优 (有时还要进行中断源识别 )
? 中断响应
? 中断服务
? 中断返回
以下以 外部中断 为主介绍这五个步骤。
1)中断请求
? 外设接口(中断源)发出中断请求信号,送到
CPU的 INTR或 NMI引脚;
? 中断请求信号:边沿请求,电平请求
例如,NMI为边沿请求,INTR为电平请求
? 中断请求信号应保持到中断被处理为止;
? CPU响应中断后,中断请求信号应及时撤销。
? 在 8086/8088系统中,外设的中断要经过 8259A
可编程中断控制器 (PIC)的排队判优后向 CPU发出:
(I/O接口 ) → PIC → CPU
n1
2.1)中断源识别
? 计算机中的中断源有很多,CPU必须识别是
哪一个设备产生中断。识别中断源有两个方
法:
? 软件查询。将中断信号从数据总线读入,用程序
进行判别,如教材图 6.18和图 6.19。
? 中断矢量法。由中断源提供中断类型号,CPU根
据类型确定中断源。( 8086/8088即采用此种
方法)
2.2)中断判优
? 多个中断源产生中断,CPU首先为谁服务?
——中断优先级排队问题。
? 中断优先级控制要处理两种情况:
? 对同时产生的中断:应首先处理优先级别较高的中断;若优先级别
相同,则按先来先服务的原则处理;
? 对非同时产生的中断:低优先级别的中断处理程序允许被高优先级
别的中断源所中断 ——即允许中断嵌套。
? 中断优先级的控制方法
? 硬件判优 ——链式判优、并行判优(中断向量法)
? 软件判优 ——顺序查询中断请求,先查询的先服务(即先查询的优
先级别高)
? 通常将 中断判优 与 中断源识别 合并在一起进行处理。
? x86系统中,这项任务由 PIC和 CPU共同完成。
INTAin
CPU
INTA
INTR
外设 1 外设 2
外设接口 1
菊花链
逻辑电路
外设接口 2
外设 3
外设接口 3
≥1
菊花链
逻辑电路
菊花链
逻辑电路

IREQ IREQ IREQ
中断确认
链式判优电路原理图(教材图 6.20)
INTAin INTAin
中断确认 中断确认
菊花链逻辑电路
INTAin
IREQ
INTR
&
=1
≥1
INTAout
DB
三态门 中




E
外设接口
中断确认
菊花链
逻辑电路
3)中断响应
? 在每条指令的最后一个时钟周期,CPU检测
INTR或 NMI信号。若以下条件成立,则 CPU
响应中断:
? 当前指令执行完。对 INTR,还应满足以下条件
? 当前指令是 STI和 IRET,则下条指令也要执行完 。
? 当前指令带有 LOCK,REP等指令前缀时,则把它们
看成一个整体,要求完整地执行完;
? 对 INTR,CPU应处于开中断状态,即 IF=1;
? 当前没有复位 (RESET)和保持 (HOLD)信号。
? 若 NMI和 INTR 同时发生,则首先响应 NMI。
3)中断响应(续)
? CPU中断响应时,要做下述三项工作:
? 向中断源发出 INTA中断响应信号;
? 断点保护,包括 CS,IP和 PSW( FLAGS)。这
主要是保证中断结束后能返回被中断的程序。
? 获得中断服务程序首地址(入口)。
如何得到中断处理程序的首地址?
? 固定入口法
? 中断向量法 ——常用
4)中断处理(中断服务)
? 中断服务子程序特点
? 为,远”过程(类型为 FAR)
? 要用 IRET指令返回
? 中断服务子程序要做的工作
? 保护现场 (PUSH reg’s)
? 开中断 (STI)
? 进行中断处理
? 恢复现场 (POP reg’s)
? 中断返回 (IRET)
5)中断返回
? 执行中断返回指令 IRET
? IRET指令将使 CPU把堆栈内保存的断点信息弹
出到 IP,CS和 FLAG中,保证被中断的程序从断
点处能够继续往下执行。
IPL
IPH
CSL
CSH
FLAGL
FLAGH
SP IPL
IPH
CSL
CSH
FLAGL
FLAGH
SP
IP
CS
FLAG
进入中断服
务程序时
中断返回后
6.4.2 8088的中断系统
? 与中断有关的控制线为,NMI,INTR,INTA#
? 8088系统的中断源
? 内部中断
? 除法溢出:类型号 0,商大于目的操作数所能表达的范围时产生。
? 单步中断:类型号 1,TF=1时产生(当前指令需执行完)
? 断点中断:类型号 3,这是一个软件中断,即 INT 3指令。
? 溢出中断:类型号 4,这是一个软件中断,即 INTO指令。
? 软件中断:即 INT n指令,类型号 n(0-255)。
? 外部中断
? 非屏蔽中断 NMI:类型号 2,不可用软件屏蔽,CPU必须响应它。
? 可屏蔽中断 INTR:类型号由 PIC提供。 IF=1时 CPU才能响应。
NMI
INTR
中断逻辑
软件中断指令
溢出中断
除法错
单步中断
非屏蔽中断请求
中断控
制器
8259A
PIC
8086/8088CPU内部逻辑
断点中断
8086/8088中断源类型







n
4
3
0
1
2
中断源的识别
? 8088系统采用中断类型码来识别不同的中
断源,每个中断源都有一个与它相对应的中
断类型码 。
? 溢出、断点、除法溢出、单步、非屏蔽中断的
类型码为 固定值
? 软件中断的类型码 由指令给出
? 可屏蔽中断的类型码 由 PIC给出
? CPU响应 INTR中断时,会产生两个中断响
应总线周期 (教材图 6.24),要求 PIC在第 2个
中断响应总线周期把中断类型码放到数据总
线上,供 CPU读入。
中断向量表( IVT)
? 存放各类中断的 中断服务程序的入口地址
(段和偏移) ——中断向量
? 表的地址位于内存的 00000H~ 003FFH,大
小为 1KB,共 256个中断向量
? 每个中断向量占用 4 Bytes,低字为段内偏
移,高字为段基址
? 根据中断类型号 获得中断服务程序入口的方
法, (n为 中断类型号 )
? 中断向量在 IVT中的存放地址= 4× n
中断向量表的初始化
? 初始化 ——将中断服务程序的入口地址放入
向量表
例:中断类型码为 48H的中断处理子程序的
名字为 int48h,编写程序段将该中断处理子
程序的入口地址放入向量表。
中断向量表的初始化
CLI
MOV AX,0
MOV DS,AX
MOV SI,48H*4
MOV AX,OFFSET int48h
MOV [SI],AX
MOV AX,SEG int48h
MOV [SI+2],AX
STI
8086/8088 CPU的中断响应过程
? 内部中断响应过程
? 无 INTA#周期
? 中断类型码固定或由指令给出
? 响应过程主要步骤:
① PUSH FLAG
② IF=0
③ PUSH CS
④ PUSH IP
⑤ 取中断向量送入 IP和 CS
中断响应过程(续)
? 外部中断响应过程
? 非屏蔽中断,与内部中断响应过程类似
? 可屏蔽中断 (时序见教材图 6.24)
① INTA#( 1), PIC进行优先级排队判优处理
② INTA#( 2), PIC把中断类型码放到 DB上, CPU读入
③ PUSH FLAG
④ IF=0
⑤ PUSH CS
⑥ PUSH IP
⑦ 取中断向量送入 IP和 CS
与内部中断一样
8088系统中各中断的优先级
? 优先级从高到低顺序如下:
? 内部中断
? NMI
? INTR
? 单步中断
N
Y
N
Y
N
N
N
N
N
Y Y
执行指令
执行完
否?
取指令
IF=1?
内部中
断?
NMI
INTR
TF=1
类型码 =0~ 255
类型码 =2
类型码 =1
中断响应,
读回类型码
FLAG入栈
TEMP←TF
TF=TF=0
CS,IP入栈
计算向量表地址
高字 →CS
低字 →IP
执行中断
服务程序
NMI?
TEMP=
1?
转入中断服务程序
恢复 CS和 IP
恢复 FLAGS
返回被中断
的程序
Y
Y
Y
Y
N
IRET
指令的 操作
8086/8088的
中断处理流程
NMI,INTR、
单步和除法错
中断同时产生
时的中断处理
过程
DIV
TF=1
IF=1
INTR NMI
PUSH FLAGS,CS,IP
CLEAR IF & TF,中断入口 →CS:IP
除法错
NMI(IF,TF = 0)
PUSH FLAGS,CS,IP
CLEAR IF & TF,中断入口 →CS:IP
NMI中断处理程序
除法错中断处理程序
(IF,TF = 0) 返回
执行下条指令
识别出 INTR
(IF,TF = 1) 返回
INTR仍然有效
继续单步执行程序
INTR中断处理程序
INTR
PUSH FLAGS,CS,IP
CLEAR IF & TF,中断入口 →CS:IP
单步 (IF,TF = 0)
PUSH FLAGS,CS,IP
CLEAR IF & TF,中断入口 →CS:IP
单步中断处理程序
(IF,TF = 0) 返回
(IF,TF = 1) 返回
6.5 可编程中断控制器 8259A
? PIC,Programmable Interrupt Controller
? 可对 8个中断源实现优先级控制
? 可扩展至对 64个中断源实现优先级控制
? 可编程设置不同工作方式
? 根据中断源向 x86提供不同中断类型码
? 引脚分配及功能见教材图 6.26
6.5.1,8259A的内部结构
? 8259A的内部结构( 教材图 6.27)
? 中断请求寄存器 IRR
? 保存从 IR0~ IR7来的中断请求信号,某位 =1表示对应的 IRi有中
断请求
? 中断服务寄存器 ISR
? 保存所有正在服务的中断源,某位 =1表示对应的 IRi中断正在被
服务
? 中断屏蔽寄存器 IMR
? 存放中断屏蔽字,某位 =1表示对应的 IRi输入被屏蔽
? 中断优先权判别电路
? 确定是否向 CPU发出中断请求,中断响应时确定 ISR的哪位应置
位及把相应中断的类型码放到数据总线上
6.5.2 8259A的工作过程
? 8259A对中断请求的处理过程如下:
? 当某 IRi有效时,IRR相应位置 1
? 若有效的 IRi未被屏蔽,则 向 CPU发出中断请求
? 检测到第 1个 INTA#信号后,置 ISRi=1,IRRi=0
? 检测到第 2个 INTA#信号后,把 ISRi=1中最高优
先级的中断类型码放到 DB上
? 若工作在 AEOI方式,在第 2个 INTA#结束时,使
ISRi复位;否则由 CPU发出 EOI命令使 ISRi复位
6.5.3 8259A的工作方式
? 8259A的工作方式有如下几类:
? 中断优先方式与中断嵌套
? 中断结束处理方式
? 屏蔽中断源的方式
? 中断触发方式
? 级联工作方式
中断优先方式与中断嵌套
? 中断优先方式
两类优先级控制方式,固定优先级 和 循环优先级
? 固定优先级方式
? 所有中断请求 IRi的中断优先级固定不变
? 优先级排列顺序可编程改变
? 加电后 8259A的默认方式,默认优先级顺序从高到低
为 IR0~ IR7
IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
7 6 5 4 3 2 1 0 3 2 1 0 7 6 5 4
最低级 最高级 最高级 最低级
优先级
IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
默认优先级 优先级可编程改变
中断优先方式与中断嵌套(续)
? 循环优先级方式
? 中断源轮流处于最高优先级,即自动中断优先级循环
? 初始优先级顺序可用编程改变
? 某中断请求 IRi被处理后,其优先级别自动降为最低,
原来比它低一级的中断上升为最高级
IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
7 6 5 4 3 2 1 0 2 1 0 7 6 5 4 3
最低级 最高级 最高级 最低级
ISR内容
IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0
IR4的服务结束以前
0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
IR4的服务结束以后
ISRi
中断优先方式与中断嵌套(续)
? 中断嵌套 方式
? 在中断处理过程中允许被更高优先级的事件所中
断称为中断嵌套。 8259A有两种中断嵌套方式:
? 普通全嵌套方式(默认方式)
一中断正被处理时,只有 更高优先级 的事件可以打
断当前的中断处理过程而被服务。
? 特殊全嵌套方式
一中断正被处理时,允许 同级或更高优先级 的事件
可以打断当前的中断处理过程而被服务。
注, 特殊全嵌套仅用于多个 8259A级连时的主 8259A,
而不能用于从属 8259A或单 8259A系统。
D.
主 8259A
IR0
IR1
IR2
IR3
IR4
IR5
IR6
IR7
一般嵌套方式:
从片的 INT被主片封
锁, 故更 高 级别的
IR0-IR2中断也无法
得到响应
特殊嵌套方式:
因主片不封锁从片的
INT,故级别高的 IR0-
IR2中断可以得到响应 。
( 但 IR3-IR7 仍被本 从
片封锁 )
C.
假定 IR7发生中
断,并获得服务
一般嵌套方式:
IR4的中断被服务
时, 这些中断将
被封锁 。
B.
特殊嵌套方式:
IR4的中断被服
务时, 只 封 锁
IR5-IR7。
A.
INT
E.
从 8259A
INT
IR0
IR1
IR2
IR3
IR4
IR5
IR6
IR7
? 一般全嵌套方式与特殊全嵌套方式的区别
去 CPU
中断结束处理方式
? 当某一 IRi中断被服务时,ISR中的相应位
ISRi=1。当服务结束后,则必须清零该
ISRi位。使 ISRi=0是通过向 8259A发出中
断结束命令( EOI命令)实现的。
? 三种 EOI命令
? 自动 EOI( AEOI) ——(自动 EOI方式)
? 非指定 EOI( NSEOI) ——(正常 EOI方式)
? 指定 EOI( SEOI) ——(特殊 EOI方式 )
? AEOI,在第 2个 INTA#结束时,由 8259A使 ISRi
自动复位;
? 因不保留当前正在服务的中断的状态,故 AEOI不能用
于中断嵌套方式
? SEOI:由 CPU发出一条 SEOI命令,该 EOI命令
中指出了所要复位的 ISR的位号。
? 用于特殊屏蔽方式
? NSEOI,由 CPU发出正常 EOI命令,该 EOI命令
使 ISRi=1的位中优先级最高的那一位复位。
? 用于普通全嵌套方式
中断服务程序

向从 PIC发 EOI命令
读从 PIC的 ISR
全 0?
向主 PIC发 EOI命令
Y
IRET
恢复现场
N
? 特殊全嵌套方式
下的 EOI处理
?只有当从 PIC的
中断全部处理完
后,才能向主 PIC
发 EOI命令
屏蔽中断源的方式
? IMR屏蔽字决定了 允许或禁止 某位 IRi所对应
的中断, IMi=1 禁止,IMi=0 允许。
? 特殊屏蔽方式:
? 提供了允许较低优先级的中断能够得到响应的特
殊手段。
? 原理,假定当前正在处理 IR6,先 进入特殊屏蔽
方式,然后 设置 IM6=1。这时,除 IR6外的所有中
断请求均能得到响应。
? 特殊屏蔽方式中只能用 SEOI命令结束中断。
? 特殊屏蔽例,
。 ; IR4中断处理程序
CLI
MOV AL,68H ; OCW3,0 1 1 0 1 0 0 0
OUT 0C0H,AL ;设置特殊屏蔽方式
IN AL,0C2H
OR AL,10H ;屏蔽 IR4
OUT 0C2H,AL
STI
。 ; IR7请求,响应,返回

CLI ;为设命令字
IN AL,0C2H ;读出屏蔽字
AND AL,0EFH ;清除 IMR4
OUT 0C2H,AL
MOV AL,48H ; OCW3,0 1 0 0 1 0 0 0
OUT 0C0H,AL ;取消特殊屏蔽
STI
。 ;继续 IR4中断服务
MOV AL,20H ; OCW2,0 0 1 0 0 0 0 0 (EOI)
OUT 0C0,AL
IRET
中断触发方式
? 边沿触发
? IRi出现上升沿表示有中断请求
? 电平触发
? IRi出现高电平表示有中断请求
? 在第 1个 INTA#结束前,IRi必须保持高电平
级联工作方式
? 单片 8259A可支持 8个中断源;
? 采用多片 8259A级连,可最多支持 64个中断
源。 n片 8259A可支持 7n+1个中断源;
? 级连时只能有一片 8259A为主片,其余的均
为从属片;
? 涉及到的 8259A引脚包括:
? CAS0-CAS2
? SP#/EN#
? IRi
? INT
级连电路连接方法
8 2 5 9 A
( 从 片 1 )
D
0
- D
7
I N T A
I N T
S P / E N
I R
7
I R
0
I R
2
I R
3
I R
4
I R
5
I R
6
I R
1
C A S
0
C A S
1
C A S
2
8 2 5 9 A
( 从 片 2 )
D
0
- D
7
I N T A
I N T
S P / E N
I R
7
I R
0
I R
2
I R
3
I R
4
I R
5
I R
6
I R
1
C A S
0
C A S
1
C A S
2
8 2 5 9 A
( 主 片 )
D
0
- D
7
I N T A
I N T
S P / E N
I R
7
I R
0
I R
2
I R
3
I R
4
I R
5
I R
6
I R
1
C A S
0
C A S
1
C A S
2
V
C C
系 统 总 线 A B, D B, C B
A
0
C S
A
0
A
0
C S
C S
R D W R W RR D W RR D
6.5.4 8259A的编程使用
? 8259A的控制命令分为
? 初始化命令字 ICW
? ICW1~ ICW4
? 向 8259A写入 ICW的过程称为 初始化编程
? 操作命令字 OCW
? OCW1~ OCW3
? 向 8259A写入 OCW的过程称为 操作方式编程
8259A内部寄存器的寻址方法
CS# RD# WR# A0 D4 D3 读写操作
0 1 0
0 0 0 写 OCW2
写 OCW3
写 ICW1
写 ICW2,ICW3,ICW4,OCW1(顺序写入 )
0 0 1
0 1 x
1 x x
0 0 1 01 x x 读出 IRR,ISR读出 IMR
? 需要 CS#,A0,RD#,WR#和 D4,D3的
配合
? 内部寄存器的访问方法如下表:
8259A的初始化顺序
? 8259的初始化流
程如图
? 注意次序不可颠倒
写 ICW1
写 ICW2
级连?
写 ICW3
需 ICW4?
写 ICW4
N
N
Y
Y
8259A的控制命令字
? 初始化 8259A必须从 ICW1开始
? 写 ICW1意味着重新初始化 8259A
? 写入 ICW1后,8259A的状态如下:
? 清除 ISR和 IMR(全 0);
? 将中断优先级设成初始状态,IR0最高,IR7最低;
? 设定为一般屏蔽方式;
? 采用非自动中断结束方式;
? 状态读出逻辑预置为读 IRR。
ICW1——初始化字
? LTIM,触发方式
? =1 高电平触发
? =0 上升沿触发
? SNGL,级连控制
? =1 单片
? =0 级连
? IC4,ICW4控制
? =1 要写 ICW4
? =0 不写 ICW4(默认 ICW4为全 0)
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 x x x 1 LTIM x SNGL IC4
ICW2——中断向量码
? T7~ T3,中断向量码的高 5位
? T2~ T0,最低 3位为中断源的序号 IRn
? 000~ 111分别对应 IR0~ IR7
? 由 8259A根据中断源的序号自动填入
例如:
若 ICW2命令字为 48H,则 IR0的中断向量码为
48H,IR7的中断向量码为 4FH,等等。
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 T7 T6 T5 T4 T3 x x x
ICW3——级连控制字
? 主片的级联控制字
? Si=1 对应 IRi线上连接了从片
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 S7 S6 S5 S4 S3 S2 S1 S0
? 从片的级联控制字
? ID2~ ID0 标识码,说明本从片连接到主片的哪
个 IR引脚上。 000~ 111分别对应 IR0~ IR7。
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 0 0 ID2 ID1 ID0
ICW3——级连控制字(续)
? ICW3必须与主从片的连接关系一致:
例如,主片的 IR4与从片的 INT线连接,则主
片的 ICW3=10H,从片的 ICW3=04H。
? 中断响应时,主片通过级连线 CAS2-CAS0送
出被允许中断的从片标识码,各从片用自己
的 ICW3与 CAS2-CAS0比较,二者一致的从
片才可发送中断向量码。
ICW4——中断结束方式字
? SFNM,特殊全嵌套
1 特殊全嵌套方式
0 一般全嵌套方式
? AEOI,自动 EOI
1 自动 EOI方式
0 非自动 EOI方式
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 0 SFNM BUF M/S AEOI 1
? BUF,缓冲方式
M/S,主 /从缓冲选择
BUF M/S
1 1 缓冲方式 /主 PIC
1 0 缓冲方式 /从 PIC
0 x 非缓冲方式 /正常
8259A的操作命令字 OCW
? OCW用于设置 8259的工作状态
? 在初始化后写入
? OCW的写入顺序可任意
? 写入地址要求:
? OCW1必须写入奇地址端口 (A0=1)
? OCW2,OCW3必须写入偶地址端口 (A0=0)
OCW1——中断屏蔽字
? Mi=1 中断请求线 IRi被屏蔽 (不允许中断 )
=0 允许该 IRi中断
? OCW1将写入 IMR寄存器。
? A0=1时读 OCW1可读出设置的 IMR内容。
A0 D7 D6 D5 D4 D3 D2 D1 D0
1 M7 M6 M5 M4 M3 M2 M1 M0
OCW2——中断结束和优先级循环
? L2~ L0,优先级编码
? R,优先级自动循环
? SL,指定优先级
? EOI,结束中断命令
R SL EOI
0 0 1 非指定 EOI 命令 (NSEOI),全嵌套方式
0 1 1 指定 EOI 命令 (SEOI),全嵌套方式,按 L2-L0编码复位 ISR
1 0 1 NSEOI 命令,优先级自动循环
1 0 0 自动 EOI,设置优先级自动循环
0 0 0 自动 EOI,取消优先级自动循环 (固定优先级 )
1 1 1 SEOI 命令,按 L2-L0编码循环优先级 (L2-L0设为最低优先级 )
1 1 0 按 L2-L0编码循环优先级 (L2-L0设为最低优先级 )
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 R SL EOI 0 0 L2 L1 L0
OCW3——屏蔽方式和读出控制字
? ESMM,允许使能特殊屏蔽方式
? SMM,特殊屏蔽方式
ESMM SMM
1 1 特殊屏蔽方式置位
1 0 特殊屏蔽方式复位
0 x 非特殊屏蔽方式
P(Polling),=1 查询方式
=0 非查询方式
A0 D7 D6 D5 D4 D3 D2 D1 D0
0 0 ESMM SMM 0 1 P RR RIS
? RR,读寄存器
? RIS,ISR/IRR选择
RR RIS
1 1 读 ISR
1 0 读 IRR
0 x 无效
OCW3(续)
? 查询方式允许 8259A不工作于中断方式,而
是以查询方式工作。
? CPU先写一个 D2=1的 OCW3,再对同一地址读
入,即可得到如下状态字节:
I x x x x R2 R1 R0
I=1表示有中断请求,中断请求号为 R2-R0
此查询步骤可反复执行,以响应多个同时发生
的中断。
? 读 IRR/ISR:写入此命令后,随后再对同一
地址读,即可得到 IRR或 ISR的内容。
8259A编程举例
? 按以下要求初始化 8259A:
? 接口地址为 20H和 21H;
? 中断为上升沿触发;单片 8259A;不写 ICW4;
? 与 IR0-IR3对应的中断向量码为 08H-0BH;
? IR4-IR7不使用。
? 根据要求,各初始化参数及工作参数如下:
? ICW1 = 00010010 = 12H
? ICW2 = 08H 中断向量码
? OCW1 = 11110000 = 0F0H 中断屏蔽字
8259A编程举例(续)
初始化程序如下:
INIT8259A:
MOV DX,20H ; A0=0,写 ICW1
MOV AL,12H ;上升沿触发,单片,不写 ICW4
OUT DX,AL
MOV DX,21H ; A0=1,写 ICW2,OCW1
MOV AL,08H ; ICW2
OUT DX,AL
MOV AL,0F0H ; OCW1:屏蔽 IR4-IR7
OUT DX,AL
6.4.5 PC机中断程序设计
1)主程序
保存原中断向量
设置自己的中断向量
初始化堆栈指针
设置 8259A的中断屏蔽字 ( 其他的已由操作系统设置 )
STI
2) 中断服务程序
保存所用到的寄存器内容
中断服务程序主体
恢复进入时保存的寄存器内容
发 EOI命令 ( 必要时可提前 )
STI( 必要时可提前 )
IRET
中断程序举例
? PC机中主 8259A的 I/O地址为 20H和 21H,中断
向量码为 08H;
? 中断请求从 IR6引入,故 中断类型号为 0EH;
? 主程序如下:;保存原来的中断向量
mov ah,35h
mov al,0eh ;中断类型码
int 21h ;取原中断向量(在 es:bx中)
mov save_ip,bx ;保存原来的中断向量
mov save_cs,es;设置自己的中断向量
push ds
mov dx,offset my_int
mov ax,seg my_int
mov ds,ax ; DS:DX的内容为 my_int的首地址
mov ah,25h
mov al,0eh
int 21h ;设置自己的中断向量
pop ds;初始化堆栈指针
mov sp,my_stack_top;设置 8259A的中断屏蔽字
in al,21h
and al,10111111b ;开放 IR6中断
out 21h,al
sti
……
<其他代码放在这里 >
……
? 子程序如下:
my_int proc far
pusha

<中断服务程序主体 >

popa
mov al,20h ; EOI命令,00100000B
out 20h,al ;写 OCW2
sti
iret
my_int endp
? 作业, p292 - 6.1,6.2,6.5,6.7,6.17(勘误 )