(a)主程序 (b)中断处理程序 图6-7 8259中断应用实验(2)参考程序流程图
图6-8 8259中断应用实验(2)参考接线图
6.6 思考题
1. 在编程过程中,用到了哪些操作命令字?
2. 在执行中断服务程序之前,保存了哪些断点?为什么?
单一中断应用实验参考程序
;***************根据CHECK配置信息修改下列符号值******************* INTR_IVADD EQU _____H ;INTR对应的中断矢量地址
INTR_OCW1 EQU _____H ;INTR对应PC机内部8259的OCW1地址 INTR_OCW2 EQU _____H ;INTR对应PC机内部8259的OCW2地址 INTR_IM EQU _____H ;INTR对应的中断屏蔽字
PCI_INTCSR EQU _____H ;PCI卡中断控制寄存器地址 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
DATA SEGMENT
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量 IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量 IM_BAK DB ? ;保存INTR原中断屏蔽字的变量 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CLI
MOV DX,PCI_INTCSR SUB DX,19H IN AL,DX
MOV DX,PCI_INTCSR ;初始化PCI卡中断控制寄存器 MOV AX,1F00H ;向PCI_INTCSR中写入003F1F00H OUT DX,AX ADD DX,2 MOV AX,003FH OUT DX,AX
MOV AX,0000H ;替换INTR的中断矢量 MOV ES,AX
MOV DI,INTR_IVADD MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址 MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址 MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位 IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字 AND AL,INTR_IM OUT DX,AL
STI
WAIT1: MOV AH,1 ;判断是否有按键按下 INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出 QUIT: CLI
MOV DX,PCI_INTCSR ;恢复PCI卡中断控制寄存器 MOV AX,0000H OUT DX,AX
MOV AX,0000H ;恢复INTR原中断矢量 MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ; MOV ES:[DI],AX ADD DI,2
MOV AX,CS_BAK ; MOV ES:[DI],AX
MOV DX,INTR_OCW1 ; MOV AL,IM_BAK OUT DX,AL STI
MOV AX,4C00H ; INT 21H
MYISR PROC NEAR ; MOV AL,39H MOV AH,0EH INT 10H MOV AL,20H INT 10H
OVER: MOV DX,PCI_INTCSR SUB DX,19H IN AL,DX
MOV DX,PCI_INTCSR ; ADD DX,2 MOV AX,003FH OUT DX,AX
MOV DX,INTR_OCW2 ; MOV AL,20H OUT DX,AL MOV AL,20H
OUT 20H,AL IRET
MYISR ENDP CODE ENDS
END START
恢复INTR原中断处理程序入口偏移地址 恢复INTR原中断处理程序入口段地址 恢复INTR原中断屏蔽寄存器的屏蔽字 返回到DOS 中断处理程序MYISR 清PCI卡中断控制寄存器标志位 向PC机内部8259发送中断结束命令