中断定义:计算机在执行正常程序过程中,暂时中止当前程序的运行,转到中断处理程序去处理临时发生的事件,处理完后又恢复原来程序的运行,这个过程称为中断(Interrupt
)。
中断功能:
引起中断的原因或能发出中断请求的来源称为中断源。
8086有两种中断源,中断分为两大类:
1)外部中断或硬件中断,从不可屏蔽中断引脚 NMI
和可屏蔽中断引脚 INTR
引入;
2)内部中断或软件中断,是为解决CPU运行过程中出现的一些意外事件或便于程序调试而设置的。
我们这门课,学习 8259A
主要是处理 INTR
。
图8.1 IBM PC机中 8086
的中断分类和中断源
不可屏蔽中断NMI,处理较紧急的情况,如存储器或I/O校验错、掉电、协处理器异常中断请求等,不受中断标志IF的影响。
可屏蔽中断由 8259A
的 INT
引脚输出,连到CPU的INTR上。只有当CPU的 FLAGS
的 IF=1
时,才允许响应此类中断请求。
8259A的输入引脚 IR0~IR7
可引入 8
级中断:时钟、键盘、串行通信口COM1和COM2、硬盘、软盘、打印机。经芯片内部判别后,将优先级高的中断请求信号送到 INT
引脚。
(1) 除法错中断
执行除法运算指令时,如除数为0或商超过了结果寄存器能容纳的范围,则产生除法错中断。
(2) 单步中断
单步标志 TF
置1,指令执行完后,产生单步中断。结果是将CPU的内部寄存器和有关存储器的内容显示出来,便于跟踪程序的执行过程,实现动态排错。
8086没有直接使TF标志置1或清0的指令,如何使 TF
标志置1或清0?使TF标志置1的程序段:
PUSHF ;标志寄存器FLAGS入栈
POP AX ;AX←FLAGS内容
OR AX, 0100H ;使AX(即标志寄存器)的
;D8=1,其余位不变
PUSH AX ;AX入栈
POPF ;FLAGS寄存器←AX
用类似方法将标志寄存器与 FEFFH
相与,可使 TF
标志清0,从而禁止单步中断。
(3) 溢出中断
溢出标志 =1
,则可由溢出中断指令 INTO
产生中断类型号为 4
的溢出中断。若OF=0
,不会产生中断。
带符号数加、减指令后应安排一条 INTO
指令,一旦溢出就能及时向CPU提出中断请求,CPU响应中断后可进行相应的处理。
(4) 软件中断指令 INT n
中断类型号 n=0~255
。它可以安排在程序的任何位置上。
(5) 断点中断
程序运行到断点时便产生中断,像单步中断一样,查看各寄存器和有关存储单元的内容。
断点可设在程序任何地方并可以设多个断点,设置的方法是插入一条 INT 3
指令。利用断点中断可以调试一段程序,比单步中断的调试速度快得多。
(1)中断响应和返回
CS、IP
寄存器的值(断点)以及标志寄存器 FLAGS
的值推入堆栈保护。IRET
返回正常程序继续执行。如何寻找中断服务程序的入口地址,是中断处理过程中的一个重要环节。
(2)中断向量表
中断向量表用来存放中断服务程序的入口地址。
256
(0~FFH
)类中断,每类中断有一个入口地址(中断向量),包含 CS
和 IP
,共 4
个字节。因此存储 256
个地址,需要占用 1K
字节,它们位于内存 00000~003FFH
的区域中(早年的8086/8088)。n
乘以 4
就能找到规定类型的中断向量,规定 IP
在前,CS
在后。0~4
的专用中断:0
-除法错中断、1
-单步中断、2
-不可屏蔽(NMI
)中断、3
-断点中断和4
-溢出中断,它们的中断向量分别存放在 00H
、04H
、08H
、0CH
和10H
开始的4
个连续单元中。举例说明中断类型号n与中断向量表的关系。
例8.1 类型号 n=44H
的中断服务程序的入口地址为 3600:2000H
,它们在中断向量表中应如何存放?
分析:中断类型号 n=44H=01000100B
,它的中断服务程序的入口地址应放在 44H*4
开始的4个字节单元中。44H*4=01 0001 0000B= 0110H
。从0110H开始存放 3600:2000H
。
例8.2 若在中断向量表中,(0040H)=240BH
,而 (0042H)=D169H
,如图8.4所示,试问这4个单元中的内容对应的中断类型号 n=
?该中断服务程序的起始地址是什么?
分析:中断服务程序的入口地址从 0040H
单元开始存放,其类型号n=40H/4=10H
(右移 2
位)。由图可知,中断类型号为 10H
的中断服务程序的入口地址=D169:240BH
。
按中断源的重要性和实时性,排出响应中断的次序,这种次序称为中断优先级。 在8086中,中断优先级从高到低的次序为:
除法错、INT n、INTO ;最高级,同一行的有同等优先级
NMI ;次高级
INTR ;较低级(由8259A引入)
单步中断 ;最低级
CPU响应中断时,一般先响应优先级高的,后响应优先级低的中断请求。如CPU正在执行中断服务程序时,有优先级较高的中断源提出请求,则将正在处理的中断暂时挂起,先为高级中断服务,服务完后再返回较低级中断,称为中断嵌套。
如何实现中断嵌套?
CLI
。STI
指令将中断打开后,才允许高级中断进入,实现中断嵌套。EOI
命令结束该级中断,并用 IRET
指令返回到中断前的断点处去继续执行原程序。每条指令执行完,CPU都要查 NMI
和 INTR
脚上是否有中断请求,若无,继续取下一条指令执行。如有则响应中断,硬件自动完成关闭中断和保护断点操作,将下条要执行指令的 CS
和 IP
(即断点)推入堆栈;然后寻找中断服务程序的入口地址,找到后就转入相应的中断服务程序。最后,恢复现场,开中断,返回断点。
CPU在执行完每条指令后,会顺序检查是否有 软中断、NMI、INTR和单步中断
,如有,则进入中断响应周期。
根据不同的中断源形成不同的中断类型码n
,再在中断向量表中,根据 n
找到各自的中断服务程序的入口地址,转入相应的中断处理程序。
例如 n=2
,则形成中断类型码 2
,再在中断向量表中找到 n*4=2*4=8
开始的连续4个字节单元,从中取出 CS:IP
,转去执行可屏蔽中断。
重点介绍从 INTR
引脚引入的可屏蔽中断的类型码是如何形成的。CPU响应 INTR
中断后,要执行两个连续的中断响应 INTA
总线周期,其时序图如图:
第一个 INTA ‾ \overline {\text{INTA}} INTA 周期,CPU使数据线 D7~D0
浮空,T2~T4
期间向 8259A
发第1个中断响应信号 INTA ‾ \overline {\text{INTA}} INTA ,表示CPU已响应此中断,禁止其它总线控制器竞争总线。
第二个 INTA ‾ \overline {\text{INTA}} INTA 周期,8259A
收到第二个 INTA ‾ \overline {\text{INTA}} INTA 信号后,将中断类型号 n
置于数据总线上,由此找到中断服务程序的入口地址。
从 8259A
的 IR7~IR0
上可引入 8
级中断,形成 8
个 8
位中断类型码,其中高 5
位 D7~D3
由用户通过对8259A编程来确定,在 PC/XT
机中为 00001
;低 3
位 D2~D0
由 IR7~IR0
的序号来决定, 见表8.1。高5位确定后,8
级中断类型码就确定了。
(1) 由硬件自动完成以下工作
FLAGS
的内容入栈;TF
;IF
标志,关中断,中断处理过程中禁止其它中断进入;TF
标志,使CPU不会以单步形式执行中断处理程序;CS:IP
入栈。(2) 进入中断服务
进入中断处理后,若在处理过程中又有 NMI
进入,NMI
中断处理后,会清除CPU中锁存的 NMI
请求信号,使加在CPU上的 NMI
只会被CPU识别一次;
接下来执行用户编写的中断服务程序,包含保护现场,中断处理和恢复现场程序。
(3) 执行用户编写的中断返回指令 IRET
CS:IP
出栈,恢复断点,恢复 FLAGS
的内容,返回主程序,继续执行下一条指令。
可接收 8
级中断,经 4
个 8
位寄存器判别后,优先级最高的中断请求信号从 INT
脚输出,送CPU的 INTR
脚请求可屏蔽中断。
内部结构:(1根地址,说明只占用了两个端口地址;D7-D0
8位数据)
中断请求寄存器 IRR \text{IRR} IRR (Interrupt Request Register
)
IR7~IR0
脚上引入,有请求时相应位置 1
。例如 IR7、IR5、IR2
上有请求, IRR \text{IRR} IRR 将置成 10100100
;0
;中断屏蔽寄存器 IMR \text{IMR} IMR (Interrupt Mask Register
)
存放中断屏蔽信息,每 1
位与 1
个 IR
位对应,置 1
禁止对应中断请求进入系统。用来有选择地禁止某些设备请求中断。
中断服务寄存器 ISR \text{ISR} ISR(Interrupt Service Register
)
保存正处理的中断请求。任一中断被响应而执行其服务程序时,相应位置 1
,直到处理结束。多重中断情况下,会有多个位置 1
。
优先级判决器 PR \text{PR} PR(Priority Resolver
)
控制电路
包含一组初始化命令字寄存器 ICW1~ICW4
和一组操作命令字寄存器 OCW1~OCW3
,管理 8259A
的全部工作。
INT
脚向CPU发中断请求信号,接收CPU或总线控制器8288送来的中断响应信号 INTA ‾ \overline {\text{INTA}} INTA ;1
,并发送中断类型号 n
,经数据总线缓冲器送到 D7~D0
;数据总线缓冲器
是 8259A
与CPU的接口,CPU经它向 8259A
写控制字,接收 8259A
送出的中断类型号,还可从中读出状态字(中断请求、屏蔽、服务寄存器的状态)和中断查询字。
读/写控制电路
接收CPU的 RD ‾ \overline {\text{RD}} RD 、 WR ‾ \overline {\text{WR}} WR 、地址、片选 。一片 8259A
只占两个I/O地址,XT机中 A0
接地址 A0
,口地址为 20H、21H
。与8086连时,A0
脚接地址 A1
,A0
的0/1选偶/奇地址口。
级联缓冲器/比较器
8259A
最多引入 8
级中断,超过 8
级要用多片 8259A
构成主从关系,级联使用。INT
接主片 IRi
。主从片的 3
条级联信号线 CAS2~CAS0
并接。8259A
必须经驱动器与数据总线相连,工作于缓冲方式;少量 8259A
系统中,8259A
可直接与数据总线相连,工作于非缓冲方式。写入初始化命令字 ICW
和控制命令字 OCW
,对 8259A
设置不同的工作方式。
最基本方式,初始化后自动进入。
IRi
脚引入的中断请求具有固定优先级,IR0~IR7
依次降低,IR0
最高。8259A
初始化后自动进入此方式。ISn
置 1
,并保持到中断结束,类型号 n
出现在 DB
上,然后进入中断处理。EOI
命令结束中断,使 ISn
复位;也可发自动结束中断命令 AEOI
。同全嵌套方式,但允许同级中断进入。
例8.3 同级中断举例。图中,从片 INT
脚接主片的 IR2
,主片角度看,从片的 8
级中断为同级中断。若正在处理 IR3
,则允许 IR0~IR2
进入, 即允许同级中断进入。必须在 IR3
中断处理程序中,用 STI
指令开中断,才允许从片中断嵌套。但全嵌套方式禁止同级中断进入。
各中断请求优先级相同,IRi
服务完后成为最低级,IRi+1
成最高级。初始优先级从高到低为 IR0~IR7
。
例8.4 参看下图的优先级自动循环方式示意图。
IR0
为最高级,若 IR1、IR3、IR6
同时请求中断,则 IRR \text{IRR} IRR 的 IR1、IR3、IR6
均置 1
。IR1
先被服务,之后 IS1=0
,IR1
成最低级,IR2
为最高级,优先级顺序:IR2->IR7、IR0、IR1
。为 IR3
服务后 IS3=0
,IR3
最低,IR4
最高,依次类推。也称为设置最低优先级方式,与优先级自动循环方式类似,只是最低优先级由程序设置,并非 IR7
最低。IRi
设为最低后,IRi+1
便是最高。
可用 CLI
指令关中断,禁止可屏蔽中断进入;开中断情况下,可将中断屏蔽寄存器 IMR \text{IMR} IMR 的相应位置1,来屏蔽某一级或某几级中断。有两种屏蔽方式:
将 IMR \text{IMR} IMR 中的某 1
位或某几位置 1
,就可将相应的中断请求屏蔽。例如,令 IMR = 00100100 \text{IMR}=00100100 IMR=00100100 ,则 IR5
和 IR2
上的中断请求被屏蔽。
仅屏蔽本级中断,高级或低级中断都允许进入。(关于优先级的改变)
中断响应后, ISR \text{ISR} ISR 的相应位 ISn
置 1
,中断结束后应将 ISn
清 0
,表示结束中断。
2
种结束中断方式:自动和非自动,后者又分普通结束和特殊结束(EOI和SEOI)。
IRi
上中断响应后, ISR \text{ISR} ISR 相应位置 1
,在CPU发来的中断响应信号 INTA ‾ \overline {\text{INTA}} INTA 的第 2
周期结束时, ISR \text{ISR} ISR相应位自动清 0
,结束中断。
AEOI
方式,中断结束时(中断服务程序)不用对 8259A
发任何命令,通常在只有一片 8259A
,多个中断不会嵌套的情况下使用。
是常用的结束中断方式,用于全嵌套方式。当CPU处理完 1
个中断请求时,需向 8259A
发 EOI
命令,8259A
收到 EOI
后,将 ISR \text{ISR} ISR 寄存器中优先级最高的中断,也就是刚服务过的中断的 ISn
清零,从而结束中断。
在非完全嵌套方式下,用 ISR \text{ISR} ISR 寄存器无法确定当前正在处理哪级中断,也无法确定哪级中断是最后响应和处理的,不能用 EOI
方式结束中断,要用特殊方式。这时要用 OCW2
命令中的 L2~L0
来指定将 ISR \text{ISR} ISR 寄存器的哪 1
位清 0
。
使用一条 IN
指令读取中断查询字,就可查到 8259A
是否有中断请求以及哪个优先级最高。下图是中断查询字格式:
为使 8259A
按预定方式工作,必须对它编程,由CPU向其控制寄存器发各种控制命令。控制命令有两类:
ICW1~ICW4
,对 8259A
初始化;OCW1~OCW3
,定义操作方式。在操作过程中,允许重设置操作命令字,动态改变 8259A
的控制方式。两类命令字被写入 8259A
的两个端口,一个为偶地址口,8259A
的 A0=0
,另一个为奇地址口,A0=1
。在 XT
机中,偶/奇地址口为 20H
和21H
。
初始化命令字 ICW1~ICW4
顺序写入控制口,设置 8259A
初始状态。8086系统中 ICW1
、ICW2
和 ICW4
必须要有,ICW3
只在级联时用。
① A0=0,ICW1
写入偶地址口;D4=1
标志位;IC4=1
需要设 ICW4
(8086必须写 ICW4
);
② 单片时 SNGL=1
, 不要写入ICW3
;级联时 SNGL=0
,要写入 ICW3
;
③ LIMT=1
从 IRi
引入中断为电平触发,0
边沿触发;
④ A7~A5
及 ADI
位用于8位CPU。
ICW2
紧跟 ICW1
写入,A0=1
,写入奇地址口,无标志位。T7~T3
位用于确定中断类型码 n
的高 5
位,低 3
位 D2~D0
则由 8259A
根据从 IR_i
上引入中断的引脚序号自动填入,从 IR0~IR7
的序号依次为 000~111
,其初值可以置为 0
。
ICW2
的高 5
位内容是可以任选的,一旦高 5
位确定,一块芯片的 8
个中断请求信号 IR0~IR7
的中断类型号也就确定了。
例8.4 在 PC/XT
机中,ICW2的高 5
位 T7~T3=00001B
,若从 IR5
上引入中断请求,则其中断类型码 n=
? 如何设置 ICW2
?
分析:从 IR5
上引入的中断类型号的低 3
位 D2~D0=101B
,由于高 5
位是 00001B
,所以从 IR5
上引入的中断类型码 n=00001 101B=0DH
,表示是硬盘中断请求。设置 ICW2
的指令为:
MOV AL, 00001000B
OUT 21H, AL
据此可知,若 ICW2
的高 5
位为 01110B
,则该 8259A
引入的 8
级中断的中断类型号 n = 01110000B ~ 01110111B = 70H~ 77H
,这是为 PC/AT
机设置的 ICW2
。
ICW3
只在级联时使用。图8.15是 ICW3
的格式和 8259A
主从结构连接图。
(a) 主片 ICW3
格式。Si=0
,IRi
上未接从片;Si=1
接有从片。
(b) 从片 ICW3
格式。低 3
位指明从片接主片哪个引脚,ID2~ID0 = 000~111
表示 IR0~IR7
引脚。
例8.5 用 3
片 8259A
按主从结构连接,如图8.15(c)。主片口地址为 20H/21H
, 从片1口地址为 A0H/A1H
,从片 2
为 B0/B1H
。试求出 3
片 8259A
的 ICW3
,并编程将 ICW3
写入各芯片的奇地址口中。
分析:
IR2
、IR7
接从片,故主片 ICW3=10000100B=84H
1
接主片 IR2
,故从片 1
的 ICW3=00000010B=02H
2
接主片 IR7
,故从片 2
的 ICW3=00000111B=07H
对各芯片写入初始化命令字 ICW3
:
MOV AL, 84H ;主片程序
OUT 21H, AL
MOV AL, 02H ;从片1程序
OUT 0A1H, AL
MOV AL, 07H ;主片2程序
OUT 0B1H, AL
如图中所示的级联系统:
只有 A
有申请(与单片系统相同):
IR6
的类型号。A、B、C
同时申请:
IR2
的请求)IR2
的级联代码;从片 2
与自己的识别码比较不同,无操作;从片 1
:相同, ISR 7 = 1 \text{ISR}_7=1 ISR7=12
个 INTA ‾ \overline {\text{INTA}} INTA:从片 1
送出 IR7
的类型号,主片不送EOI
命令,给主片送 EOI
的条件——从片 ISR=00H \text{ISR=00H} ISR=00H8086系统 ICW4
必须设置,写入奇地址口。无级联时 ICW4
应在 ICW2
后写入,级联时它在 ICW3
后写入。图8.16 ICW4
的格式:
ICW4
各位的含义:
D7~D5=000
,为标志位;SFNM=1
,设置特殊全嵌套方式(Special Fully Nested Mode
),否则为一般全嵌套方式;BUF
和 M/S
配合使用决定缓冲或非缓冲方式等;AEOI=1
,选择 AEOI
方式,即自动结束中断方式;AEOI=0
,为非 AEOI
(非自动结束中断)方式,须在中断服务程序中安排操作命令字 OCW2
,选择所需的方式结束中断;例8.6 在 PC/XT
机中,只使用一片 8259A
,ROM BIOS
中对 8259A
进行初始化的程序为:
MOV AL, 00010011B ;ICW1:边沿触发,
;单级,要ICW4
OUT 20H, AL
MOV AL, 00001000B ;ICW2:中段类型号
;基值为08H
OUT 21H, AL
MOV AL, 00001001B ;ICW4:全嵌套,
;缓冲,非AEOI
OUT 21H, AL
8259A
工作期间,可写入操作命令,让它按需要方式工作。
3
个操作命令字 OCW1~OCW3
,用来发非 AEOI
方式结束中断的命令、优先级循环命令、中断查询命令,还可设置或撤销 AEOI
循环命令、设置或撤销特殊屏蔽方式、读内部寄存器的状态,功能比较复杂,尤其是 OCW2
。OCW
在应用程序内部设置,没有规定写入顺序,但写入的端口地址有规定:OCW1
必须写入奇地址口,OCW2
和 OCW3
要求写入偶地址口。OCW1
也称中断屏蔽字,直接对中断屏蔽寄存器 IMR \text{IMR} IMR 的各位进行置 1
或清 0
。当 Mi
位置 1
,相应 IRi
的中断请求将被屏蔽,清 0
则允许中断。
屏蔽某个 IRi
中断,并不影响其它脚上的中断请求。允许随时读出 IMR \text{IMR} IMR 的内容,供CPU分析。
例8.7 某系统只允许键盘(IR1
)中断,其余位均屏蔽,8259A
口地址 20H/21H
,试写入中断屏蔽字。如系统中要新增键盘中断,其余屏蔽位不变,如何设置屏蔽字。
只允许键盘中断的程序段为:
MOV AL, 11111101B ;D1=0,IR1没被屏蔽,
;其余均被屏蔽
OUT 21H, AL
新增键盘中断的程序段为:
IN AL, 21H ;用IN指令读屏蔽字
AND AL, 11111101B ;仅D1清0,其余位不变
OUT 21H, AL ;写入修改后的屏蔽字
OCW2
设置优先级循环方式和中断结束方式的命令字:
OCW2
各位有单独的含义:
D4D3=00
,是 OCW2
的标志位。和 ICW1
进行区分。R
(Rotate
) :R=1
,优先级按循环方式设置,否则为非循环方式。SL
(Specific Level
):SL=1
,OCW2
中的 L2~L0
有效,否则无效。EOI
(End of Interrupt
) :结束中断命令。EOI=1
,当前 ISR \text{ISR} ISR 寄存器相应位清 0
。当 ICW4
中的 AEOI=0
,即非自动结束中断时,可用它来结束中断。L2~L0
在 SL=1
时,配合 R
、SL
、EOI
设置来确定一个中断优先级的编码,L2~L0
的编码000~111
,分别与 IR0~IR7
相对应。R、SL、EOI
组合设置,具有不同的意义:
(1) R SL EOI=001
,发 EOI
命令
在中断服务程序结束时,IRET
指令前,发 EOI
命令结束中断,将服务寄存器中刚服务过的 ISn
位清 0
,结束中断。设置命令的方法是将 00100000B=20H
输出到 8259A
的偶地址口中。EOI
命令是最常用的中断结束命令。
例8.9 在PC机的中断服务程序中设置中断结束命令,使相应的 ISn
清 0
。程序段如下:
MOV AL, 20H ;OCW2的EOI命令
OUT 20H, AL ;发EOI命令
(2) R SL EOI=011
,发 SEOI
命令
在中断服务程序结束时,发特殊结束中断命令 SEOI
,到底结束哪一级中断由 L2~L0
指定,将相应的 ISn
清 0
。
例8.10 发特殊结束中断 SEOI
命令,结束 5
级中断。
MOV AL, 01100101B ;OCW2的SEOI命令, L2~L0=101
OUT 20H, AL ;将IS5清0, 结束5级中断
(3) R SL EOI=101
,发 EOI
循环命令
采用 EOI
方式结束中断,将刚服务过的优先级最高的 ISn
清 0
,同时将刚结束的中断请求 IRi
的优先级设为最低级,使 IRi+1
置为最高级,将优先级置为自动循环方式。
(4)R SL EOI=100
,设置 AEOI
循环命令
使 8259A
采用自动结束中断方式结束中断,CPU响应中断时,在中断总线周期的第二个 INTA ‾ \overline {\text{INTA}} INTA 脉冲结束时,将 ISR \text{ISR} ISR 寄存器的相应位清 0
,并使优先级置为自动循环方式。
(5) R SL EOI=000
,发清除 AEOI
循环方式命令
(6) R SL EOI=111
,发 SEOI
循环命令
采用特殊结束中断方式结束中断,使 ISR \text{ISR} ISR 寄存器中由 L2~L0
指定的相应 ISn
位清 0
,并置优先级为自动循环方式。
例8.11 发 OCW2
命令,结束 2
级中断,并置优先级为自动循环方式。
MOV AL, 11100010B ;OCW2的SEOI循环命令,
;L2~L0=010
OUT 20H, AL ;IS2=0结束2级中断, 优先级
;IR2最低, IR3为最高
(7) R SL EOI=110
,设置最低优先级循环命令
将 L2~L0
指定的中断请求 IRi
设置为最低优先级,其余按循环方式给出。(对应优先级特殊循环)
例8.12 要求发OCW2命令,使IR3设为最低优先级,优先权按循环方式给出。
MOV AL, 11000011B ;将IR3置为最低优先级, IR4置为最高优先级
OUT 20H, AL
(8) R SL EOI=010
无效命令字
OCW3
的格式如图所示。(下图的 D7
其实是 0
不是 R
)
OCW3
命令字含义:
D4D3位=01
是 OCW3
的标志位( 20H
端口,标志为进行区分)。D6D5=11
,设置特殊屏蔽方式,D6D5=10
时撤销该方式。P
位是中断查询(Poll
)位,若 P=1
向 8529A
发中断查询命令,紧接着用 IN
指令读取中断查询字。查询字格式见图。RR
位为读寄存器,RR=1
,允许读 IRR \text{IRR} IRR 或 ISR \text{ISR} ISR 寄存器的内容。进一步查看 RIS
;若 RIS=0
,下次 IN
指令读取 IRR \text{IRR} IRR 内容;若 RIS=1
,则读取 ISR \text{ISR} ISR 内容。RR=0
为无效命令。例8.13 编写读取中断屏蔽字 (21H
)、中断查询字(20H
)及中断服务寄存器的程序段。
读取中断屏蔽字的程序段:
IN AL, 21H ;从奇地址口读IMR, 获得中断屏蔽字
读取中断查询字的程序段:
MOV AL, 00001100B ;OCW3, P=1, 发查询命令
OUT 20H, AL ;OCW3写入偶地址口
IN AL, 20H ;AL←中断查询字。若AL=
;10000110B,表示有中断请求, 且IR6上的优先级最高
读取中断服务寄存器 ISR \text{ISR} ISR 的程序段:
MOV AL 00001011B ;OCW3, RR-RIS=11,
;下次读ISR
OUT 20H, AL ;OCW3写入偶地址口
IN AL, 20H ;AL←ISR内容
特定屏蔽方式(开放高级和低级中断)设置方法(在某一个中断的中断服务程序中设置的,把我的中断优先级屏蔽掉,允许中断嵌套;设置后一直有效,直到清除):
① 用 OCW1
屏蔽当前中断
② 用 OCW3
设置特定屏蔽方式
清除方法:
① 用 OCW3
清除特定屏蔽方式
② 用 OCW1
开放当前中断
如在 IR3
的服务程序中使用,IR0-2
开放,IR3-7
关闭。比 IR3
优先级低的中断的服务程序必须送指定 EOI
。
... ;IR0-2开放,IR3-7关闭; 下面设置特殊屏蔽方式
CLI ;关中断
IN AL, 21H ;读入中断屏蔽字
OR AL, 08H ;屏蔽第3个引脚 0000_1000
OUT 21H, AL ;送出去
MOV AL, 68H ;0_11_01_0_00特殊屏蔽字
OUT 20H, AL ;发特殊屏蔽字
STI ;开中断
... ;IR0-2开放,IR4-7开放,IR3关闭
CLI ;关中断; 下面关闭特殊屏蔽方式
MOV AL, 48H ;0_10_01_0_00
OUT 20H, AL ;清除特殊屏蔽方式
IN AL, 21H ;读入中断屏蔽字
AND AL, 0F7H ;开放自己,IMR3=0
OUT 21H, AL ;送出去
STI ;开中断
...
MOV AL, 20H ;EOI命令
OUT 20H, AL
RET
早期PC机——单片系统端口地址:20H、21H
;
08H~0FH
初始化编程:
MOV AL, 13H
OUT 20H, AL ;ICW1
MOV AL, 08H
OUT 21H, AL ;ICW2
MOV AL, 01H
OUT 21H, AL ;ICW4
286以上PC机——双片级联系统:
IR2
上,主从级联信号互连20H、21H
;从片:0A0H、0A1H
初始化编程(主)
MOV AL, 11H ;000_1_0_0_01
OUT 20H, AL
MOV AL, 08H
OUT 21H, AL
MOV AL, 04H
OUT 21H, AL
MOV AL, 01H
OUT 21H, AL
初始化编程(从)
MOV AL, 11H
OUT 0A0H, AL
MOV AL, 70H
OUT 0A1H, AL
MOV AL, 02H
OUT 0A1H, AL
MOV AL, 01H
OUT 0A1H, AL