MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址 MOV ES:[DI],AX ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址 MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字 MOV AL,IM_BAK OUT DX,AL STI
MOV AX,4C00H ;返回到DOS INT 21H
MYISR PROC NEAR ;中断处理程序MYISR PUSH AX MOV AL,39H MOV AH,0EH INT 10H
MOV AL,20H INT 10H
OVER: MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令 MOV AL,20H OUT DX,AL MOV AL,20H_ OUT 20H,AL_ POP AX IRET MYISR ENDP
CODE ENDS
END START
(代码结束)
(2)扩展中断源查询应用实验 实验说明:
利用实验平台上的8259控制器,可以对总线上的INTR进行扩展。将8259的INT连接到INTR,8259的8路中断请求线IR0~IR7就成了单一INTR中断请求线的扩充。这8路中断源共用INTR的中断矢量和中断服务程序。在INTR的中断服务程序中通过对8259的OCW3的查询,可以确定中断是由哪个IR(IR0~IR7)产生的,然后转到相应的服务程序进行处理。
由于要求实现8259控制器IR0、IR1两路中断,可用KK1+和KK2+模拟两个中断源,在IR0对应的服务程序中显示字符“0”,在IR1对应的服务程序中显示字符“1”。
第 31 页
图2-2 8259扩充中断源实验参考接线图 实验步骤如下:
①实验接线图如图2-2所示,按图接线。
②运行Tdpit集成操作软件,调用程序代码(T8259-2.ASM),填写程序代码中的空缺处,编译、链接。
③使用运行命令运行程序,按动KK1+、KK2+按键,观察中断是否产生。 实验代码如下:
INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址 INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址 INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字
IOY0 EQU 3000H ;片选IOY0对应的端口始地址
MY8259_ICW1 EQU IOY0+00H ;实验系统中8259的ICW1端口地址 MY8259_ICW2 EQU IOY0+04H ;实验系统中8259的ICW2端口地址 MY8259_ICW3 EQU IOY0+04H ;实验系统中8259的ICW3端口地址 MY8259_ICW4 EQU IOY0+04H ;实验系统中8259的ICW4端口地址 MY8259_OCW1 EQU IOY0+04H ;实验系统中8259的OCW1端口地址 MY8259_OCW2 EQU IOY0+00H ;实验系统中8259的OCW2端口地址 MY8259_OCW3 EQU IOY0+00H ;实验系统中8259的OCW3端口地址
STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
DATA SEGMENT
MES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$'
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
第 32 页
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 ;设置IMR,打开INTR的屏蔽位 IN AL, DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字 AND AL, INTR_IM OUT DX, AL
MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1 MOV AL,_13H_ ;边沿触发、单片8259、需要ICW4 OUT DX,AL
MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2 MOV AL, _F8H_ OUT DX, AL
MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4 MOV AL, _05H_ ;非自动结束EOI OUT DX, AL
MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1 MOV AL, _FCH ;打开IR0和IR1的屏蔽位 OUT DX, AL STI
WAIT1: MOV AH,1 ;判断是否有按键按下
INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出
QUIT: CLI
MOV DX,PCI_INTCSR ;恢复PCI卡中断控制寄存器 MOV AX, 0000H
第 33 页
OUT DX, AX
MOV AX, 0000H ;恢复INTR原中断矢量 MOV ES, AX
MOV DI, INTR_IVADD
MOV AX, IP_BAK ;恢复INTR原中断处理程序入口偏移地址 MOV ES:[DI],AX ADD DI, 2
MOV AX, CS_BAK ;恢复INTR原中断处理程序入口段地址 MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原IMR的屏蔽字 MOV AL, IM_BAK OUT DX, AL STI
MOV AX, 4C00H ;返回到DOS INT 21H
MYISR PROC NEAR ;中断处理程序MYISR
QUERY: MOV DX,MY8259_OCW3 ;向8259的OCW3发送查询命令
MOV AL, 0CH OUT DX, AL
IN AL, DX ;读出查询字
TEST AL,80H ;判断中断是否已响应 JZ QUERY ;没有响应则继续查询
CMP AL, 00H
JE IR0ISR ;若为IR0请求,跳到IR0处理程序 JNE IR1ISR ;若为IR1请求,跳到IR1处理程序 JMP EOI
IR0ISR: MOV AL,30H ;IR0处理,显示字符串STR0
MOV AH,0EH INT 10H
MOV AL,20H INT 10H JMP EOI
IR1ISR: MOV AL,31H ;IR1处理,显示字符串STR1
MOV AH,0EH INT 10H
MOV AL,20H INT 10H JMP EOI
EOI: MOV DX,MY8259_OCW2 ;向平台上8259发送中断结束命令
MOV AL,20H OUT DX,AL
OVER: MOV DX,PCI_INTCSR
SUB DX,19H IN AL,DX
MOV DX,PCI_INTCSR ;清PCI卡中断控制寄存器标志位
第 34 页
ADD DX,2
MOV AX, 003FH OUT DX,AX
MOV DX,INTR_OCW2 ;向PC机内8259发送中断结束命令
MOV AL,20H OUT DX,AL MOV AL,20H OUT 20H,AL IRET
MYISR ENDP
CODE ENDS
END START
(代码结束)
五、思考题
1.单中断与多中断有何不同?
答:单中断不存在优先级问题,只存在有与没有两种情况;多中断由于可能出现同时提出中断请求的情况,需要8259A来进行优先级排序。 2.如何改变中断优先级的顺序?
答:在8259A全嵌套模式下,IRi的优先级顺序是确定的,0为最高,7为最低,更改中断信号所接的引脚即可更改中断优先级的顺序。
3.可编程中断控制器8259A在协助CPU处理中断事务中起哪些作用? 答:可以处理多个中断请求,并且自动判断优先级。可以告知CPU是否有中断,若有则将优先级最高的中断号送给CPU。 4.可屏蔽中断与8259A是什么关系? 答:可屏蔽中断是由8259A实现的。
第 35 页