8259A中断程序初始化与设计
1.基本概念
(1) 中断向量
中断向量是一个4x1字节的单元,低字节用来存储中断程序的入口地址中的偏移地址,高字节存储另一半的段地址
(2) 中断向量表
在内存中,我们定义0000H段的中存储了256种中断程序(方法0~255)的入口地址,其大小为256x4字节
(3)中断向量号/中断类型号
由于中断向量表被分成了256份的"4个单元"(中断向量),因此中断向量号N可以代表要查找的第N个中断向量,其在中断向量表中的偏移地址可以用4xN计算得到
2.初始化:写入控制数
对于8259A,我们需要写入控制数来告诉芯片我们需要的工作模式
以端口地址为60H~61H为例
ICW1:查表.典型值为13H 写入端口偶地址
ICW2:写入8259的中断矢量号 写入端口奇地址
ICW3:一般不写
ICW4:查表.典型值01H 写入端口奇地址
OCW1:表示允许发生的中断地址i.把允许发生中断的Di位写0,其余写1.如允许IR5发生中断,写奇地址OCW1=1101 1111B=0DFH.
由于OUT/IN指令规定只能使用AX传输数据,因此写入每个控制字需要两条指令
以HEU2019年程序题为例:
已知8259端口地址为60H-61H,8259的中断矢量号从70H开始,允许发生的中断地址为IR4
8259部分代码如下:
CODE SEGMENT
;8259初始化
ASSUME CS:CODE
MOV AL,13H
OUT 60H,AL;ICW1
MOV AL,70H
OUT 61H,AL;ICW2
MOV AL,01H
OUT 61H,AL;ICW4
MOV AL,0EFH
OUT 61H,AL;OCW1=11101111B=0EFH
STI
3.建立中断向量表
原理:
- 获取中断服务程序入口地址的偏移地址存入低位
- 获取中断服务程序入口地址的段地址存入高位
已知中断矢量号起始为70H,允许的中断地址为IR5
PUSH DS ;配合POP指令保护DS
MOV AX.0
MOV DS,AX ;DS写0,进入0000H段
MOV AX,OFFSET MIR5 ;获取中断服务程序偏移地址
MOV SI,01D4H ;计算(70H+5H)x4=01D4H
MOV [SI],AX ;写入低位偏移地址
MOV AX,CS ;由于MIR5在代码段,所以使用CS作为段寄存器
MOV [SI+2],AX ;写入高位段地址
POP DS ;DS复原
4.中断服务程序格式和中断结束
EOI=1时,中断自动结束
MIR5: MAIN ;这里执行中断程序的主任务
...
OUTT: MOV AL,20H ;发送中断结束命令
OUT 60H,AL ;OCW2写入EOI
IRET ;中断返回