目录
一、8086/8088 中断系统
1. 8086/8088 中断源类型
对内部中断来说,中断的控制完全是在 CPU 内部完成的;而对于外部中断,则是利用 CPU 的两条中断输入信号线 INTR 和 NMI 来告诉 CPU 已发生了中断事件。
INTR 称为可屏蔽中断输入信号,因为 CPU 能否响应该信号还受到中断允许标志寄存 IF 的控制。
; 中断允许标志位
IF = 1 ; 开中断,CPU在一条指令执行完后对INTR做出响应
IF = 0 ; 关中断,CPU不予响应,该中断请求被屏蔽
NMI 称为非屏蔽中断请求输入信号,上升沿有效。它不受标志位 IF 的约束,只要 CPU 在正常地执行程序,它就一定会响应 NMI 的请求。
2. 中断向量表
中断向量表用于存放各类中断服务程序的入口地址。
- 每个入口地址占 4 个字节,低字为段内偏移地址,高字为段地址
- 向量表共存放 256 个入口地址
- 向量表的地址范围为 00000H ~ 003FFH
- 向量表的大小为 256 × 4B = 1KB
向量地址(考点)
向量表所在段的段地址 = 0
向量地址的偏移地址 = n * 4 ; n为中断类型码
将用户定义的中断服务程序入口地址放入向量表的方法。
题:将类型码为 48H 的中断服务子程序 TIMER 的中断向量放入向量表。
MOV AX, 0000H ; 向量表所在的段地址=0
MOV DS, AX
MOV SI, 48H*4 ; 向量地址的偏移地址
MOV BX, OFFSET TIMER ; 入口地址的偏移地址
MOV [SI], BX
MOV BX, SEG TIMER ; 入口地址的偏移地址
MOV [SI+2], BX
3. CPU 中断类型码的获取方法
① 内部中断和 NMI 中断
此类中断没有 INTA 总线周期,中断类型码固定或者由指令给出。
② 可屏蔽中断
二、8259A 的引线及内部结构
1. 外部引线
2. 内部结构
8259A 的内部结构框图
3. 与系统总线的连接方式
① 缓冲方式
② 非缓冲方式
4. 级联连接方式
注意:图中 SP/EN 的连接只针对非缓冲方式。
5. 中断触发方式
① 边沿触发方式
② 电平触发方式
三、8259A 的工作过程
(2)综合当前中断服务寄存器 ISR 和中断屏蔽寄存器 IMR 的状态,找出最高优先权的中断请求,并且判断是否能够发出中断请求。若能则向 CPU 发出信号 INT,请求中断服务。
(3)在多级级联的情况下,主片收到第一个 INTA 脉冲后,通过 CAS2 ~ CAS0 发出从片编码。所有从片均将收到该编码,并且与自身编码进行比较。若相等,则该片在收到第二个 INTA 脉冲后发出中断类型码。
四、8259A 的工作方式
1. 中断优先级控制方式
① 固定优先级方式
② 自动循环优先级方式
③ 特殊循环优先级方式
用控制命令指定最低优先级的中断源。
2. 中断嵌套方式
① 普通全嵌套方式
② 特殊全嵌套方式
③ 对比
3. 中断结束处理方式
① 自动中断结束方式
② 正常中断结束方式
③ 特殊中断结束方式
主要用于特殊循环方式及特殊屏蔽方式下的中断结束,即当前执行的中断程序所对应的 ISR 中需要复位的位不一定是所有置 1 的优先级最高位。
④ 小结
不管是正常中断结束方式,还是特殊中断结束方式,在一个中断服务子程序结束时,对于级联使用的 8259A 都必须发两次中断结束命令,一次是发给主片的,另一次则是发给从片的。
4. 中断源屏蔽方式
① 普通屏蔽方式
② 特殊屏蔽方式
PPT:
五、8259A 的控制命令
8259A 是可编程中断控制器,在它工作之前,必须通过软件向其写入控制命令的方法来让它工作在人们所希望的状态下,这就是 8259A 的编程。控制命令分为:
- 初始化命令字 ICW(Initialization Command Word)
- 操作命令字 OCW(Operation Command Word)
写入 8259A 后被保存在内部的 ICW 和 OCW 寄存器组中。相应地,对 8259A 的编程也分为初始化编程和操作方式编程两个步骤:
- 初始化编程:由 CPU 向 8259A 送 2~4 个字节的初始化命令字 ICW。在 8259A 工作之前,必须写入初始化命令字使其处于准备就绪状态。
- 操作方式编程:由 CPU 向 8259A 送 3 个字节的操作命令字 OCW,以规定 8259A 的操作方式。OCW 可在 8259A 初始化以后的任何时刻写入。
1. 8259A 内部寄存器的寻址方式
当对 8259A 进行写时,若 I/O 地址为奇数,则写的对象将包括 4 个寄存器(ICW2、ICW3、ICW4 和 OCW1),即一个 I/O 地址对应了 4 个寄存器,为了区分到底写入的是哪个寄存器,8259A 规定初始化的顺序必须严格按照规定的顺序依次写入,即根据顺序来区分不同的寄存器。
2. 8259A 的初始化顺序
3. 8259A 的初始化命令字 ICW
① ICW1:初始化字(确定写入字节数 2~4)
写 ICW1 意味着重新初始化 8259A,ICW1 决定了写几次寄存器,即写几个字节。
② ICW2:中断类型码
ICW2 为中断类型码寄存器,用于存放中断类型码。CPU 响应中断时,8259A 将该寄存器内容放到数据总线上供 CPU 读取。
初始化时只需设定中断类型码的高 5 位,低 3 位由 8259A 在中断响应时根据中断源的序号自动填入。
举例
③ ICW3:级联控制字
ICW3 仅在多片 8259A 级联时需要写入。主片的 8259A 的 ICW3 与从片的 ICW3 在格式上不同。ICW3 应紧接着 ICW2 写入同一 I/O 地址中。
举例
④ ICW4:方式命令字(主要完成主从设定)
ICW4 紧跟在 ICW3 之后写入同一 I/O 地址中。
缓冲方式与非缓冲方式:
4. 8259A 初始化编程
举例:以微型计算机中使用的单片 8259A 为例,试对其进行初始化设置。在微型计算机中,8259A 的 ICW1 和 ICW4 的端口地址分别为 20H、21H 。
初始化设置的程序段如下:
MOV AL, 13H ; 设置ICW1
; 中断请求信号采用边沿触发方式
; 单片8259A,后面使用ICW4
OUT 20H, AL
MOV AL, 18H ; 设置ICW2
; 将中断类型码高5位指定为00011
OUT 21H, AL
MOV AL, 0DH ; 设置ICW4
; 不用特殊全嵌套方式/不用中断自动结束
; 采用缓冲方式/工作于8088/8086系统
OUT 21H, AL
5. 8259A 操作命令字
① OCW1:中断屏蔽字
OCW1 用于决定中断请求线 IR 被屏蔽否。初始时为全 0(全部允许中断)。
② OCW2:中断结束和优先级方式控制字
OCW2 与 OCW3 共用一个端口地址,但其特征位 D4D3=00,因此不会发生混淆。
SL = 1,用于特殊循环优先级方式;SL = 0,用于普通循环优先级方式。
③ OCW3:屏蔽方式和状态读出控制字
三大功能:
6. 8259A 编程
例、两片 8259A 级联,提供 15 级向量中断。CAS2 ~ CAS0 作为互连线,从片 8259A 的 INT 直接连到主片 8259A 的 IR2 上。
“提供 15 级向量中断”?
① 主片 8259A 初始化编程
; 对主片8259A的初始化
INTM00 EQU 020H ; 主片8259A端口0
INTM01 EQU 021H ; 主片8259A端口1
...
MOV AL, 00010001B ; 写入ICW1
; 边沿触发、级联方式、要写ICW4
OUT INTM00, AL
JMP SHORT $+2 ; I/O端口延时,等价于NOP, NOP
MOV AL, 00001000B ; 写入ICW2
; 设置主片中断类型码,起始为08H
OUT INTM01, AL
JMP SHORT $+2
MOV AL, 00000100B ; 写入ICW3
; 表示从8259A的INT输出是连接到主片的IR2
OUT INTM01, AL
JMP SHORT $+2
MOV AL, 00010001B ; 写入ICW4
; 非总线缓冲、特殊全嵌套、一般EOI
OUT INTM01, AL
JMP SHORT $+2
② 从片 8259A 初始化编程
; 对从片8259A的初始化
INTS00 EQU 0A0H ; 从片8259A端口0
INTS01 EQU 0A1H ; 从片8259A端口1
...
MOV AL, 00010001B ; 写入ICW1
; 边沿触发、级联方式、要写ICW4
OUT INTS00, AL
JMP SHORT $+2 ; I/O端口延时,等价于NOP, NOP
MOV AL, 01110000B ; 写入ICW2
; 设置从片中断类型码,起始为70H
OUT INTS01, AL
JMP SHORT $+2
MOV AL, 00000010B ; 写入ICW3
; 设置从片识别标志,对应主片的IR2
OUT INTS01, AL
JMP SHORT $+2
MOV AL, 00000001B ; 写入ICW4
; 非总线缓冲、普通全嵌套、一般EOI
OUT INTS01, AL
JMP SHORT $+2
六、中断程序设计概述
① 中断服务程序主体
MY_INT PROC FAR
PUSH <需要保护的寄存器1>
...
PUSH <需要保护的寄存器i>
STI ; 开中断
<中断服务程序主体>
CLI ; 关中断
MOV AL, 20H ; EOI命令,00100000B
OUT 20H, AL ; 写OCW2
POP <在入口处保护的寄存器i>
...
POP <在入口处保护的寄存器1>
STI ; 开中断
IRET
MY_INT ENDP
② 主程序设置中断向量
; 设置自己的中断服务程序入口
CLI ; 关中断
PUSH DS
XOR AX, AX
MOV DS, AX ; 向量表段地址=0
MOV BX, n*4 ; 中断类型码
MOV AX, OFFSET MY_INT
MOV [BX], AX
MOV AX, SEG MY_INT
MOV [BX+2], AX
POP DS
STI ; 开中断