一、实验目的
掌握中断服务程序的编写。
二、实验电路
|
三、实验内容
1.实验用PC机内部的中断控制器8259A,中断源用TPC-ZK实验箱上的单脉冲电路,将单脉冲电路的输出接中断请求信号IRQ,每按一次单脉冲按键产生一次中断请求。
2.编写程序,要求每次主机响应外中断IRQ时,显示"THIS IS A 8259A INTERRUPT !",在键盘上敲任意一个键,程序退出。
四、编程提示
1.本实验用TPC-ZK实验系统的USB接口,USB接口实验箱固定接到了PC机主片中断控制器8259的IRQ3上,即进行中断实验时,所用中断类型号为0BH,编程时要根据0BH中断类型号设置中断矢量。
2. PC机主片中断控制器8259的地址为20H、21H。主片8259中断屏蔽寄存器IMR对应位(IRQ3)要清零(允许中断):
IN AL,21H
AND AL,11110111B
OUT 21H,AL
中断服务结束前要使用中断结束命令:
MOV AL,20H
OUT 20H,AL
中断结束返回DOS时将IMR对应位置1,屏蔽中断。
IN AL,21H
OR AL,08H
OUT 21H,AL
五、实验程序(必须加注释)和结果
IRO_MASK EQU 11110111B ; 中断屏蔽码,二进制表示为11110111,用于设置8259A中断控制器的中断屏蔽寄存器
DATAS SEGMENT
MS1 DB 0DH,0AH,'THIS IS A 8259A INTERRUPT!',0DH,0AH,'$' ; 定义字符串,用于显示中断信息
MS2 DB 0DH,0AH,'PRESS ANY KEY TO EXIT!',0DH,0AH,'$' ; 定义字符串,用于提示用户按任意键退出
MS3 DB 0DH,0AH,'guozhihong2022900624 AND mingruizhao2022900625',0DH,0AH,'$' ; 定义字符串,可能是作者信息
CSREG DW? ; 用于存储旧的中断向量段地址
IPREG DW? ; 用于存储旧的中断向量偏移地址
DATAS ENDS
STACKS SEGMENT
; 此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV ax,DATAS
MOV ds,AX
MOV dx,OFFSET MS3
MOV ah,09H
INT 21H ; 显示作者信息
MOV DX,OFFSET MS1
MOV ah,09H
INT 21H ; 显示中断信息
CLI ; 关中断,禁止其他中断发生
MOV ax,350bh
INT 21h ; 获取旧的中断向量
MOV ax,es
MOV CSREG,ax ; 存储旧的中断向量段地址
MOV IPREG,bx ; 存储旧的中断向量偏移地址
MOV ax,cs
mov ds,ax
MOV dx,offset INT_PROC
MOV ax,250bh
INT 21h ; 设置新的中断向量
IN al,21h
AND al,11110111b
OUT 21h,al ; 设置8259A中断控制器的中断屏蔽寄存器
MOV dx,offset MS2
MOV ah,09h
INT 21h ; 显示提示信息
STI ; 开中断,允许其他中断发生
AG:
MOV ah,1
INT 16h
JZ AG ; 等待用户按键
EXIT:
CLI ; 关中断
MOV dx,IPREG
MOV ax,CSREG
MOV ds,ax
MOV ax,250bh
INT 21h ; 恢复旧的中断向量
IN al,21h
or al,00001000b
OUT 21h,al ; 恢复8259A中断控制器的中断屏蔽寄存器
MOV ax,4c00h
INT 21h ; 程序结束,返回操作系统
INT_PROC PROC
PUSH ax
PUSH dx
PUSH ds
MOV ax,DATAS
MOV ds,ax
MOV dx,offset MS1
MOV ah,09h
INT 21h ; 显示中断信息
MOV al,20h
OUT 20h,al ; 发送中断结束命令给8259A中断控制器
POP ds
POP dx
POP ax
IRET ; 中断返回
INT_PROC ENDP
CODES ENDS
END START
代码注释说明
IRO_MASK EQU 11110111B:定义了一个常量,用于设置8259A中断控制器的中断屏蔽寄存器。
DATAS SEGMENT:定义了数据段,包含了要显示的字符串和用于存储旧中断向量的变量。
STACKS SEGMENT:定义了堆栈段,但代码中没有具体内容。
CODES SEGMENT:定义了代码段,包含了程序的主要逻辑。
START:程序的入口点,包含了初始化和中断处理的代码。
INT_PROC PROC:定义了中断处理程序,用于处理8259A中断控制器产生的中断。
CODES ENDS:代码段结束。
END START:程序结束。
代码执行流程
程序开始,显示作者信息。
显示中断信息。
保存旧的中断向量。
设置新的中断向量,指向自定义的中断处理程序。
设置8259A中断控制器的中断屏蔽寄存器。
显示提示信息,等待用户按键。
用户按键后,恢复旧的中断向量。
恢复8259A中断控制器的中断屏蔽寄存器。
程序结束,返回操作系统。
代码中的关键操作
CLI和STI:用于关闭和开启中断。
INT 21H:用于调用DOS系统功能,如显示字符串和获取/设置中断向量。
IN和OUT:用于与8259A中断控制器进行数据传输。
PUSH和POP:用于保存和恢复寄存器的值。
IRET:用于从中断处理程序返回。
代码中的数据结构和变量
MS1、MS2和MS3:用于存储要显示的字符串。
CSREG和IPREG:用于存储旧的中断向量段地址和偏移地址。
代码中的函数和子程序
INT_PROC:中断处理程序,用于处理8259A中断控制器产生的中断。
代码中的输入输出操作
MOV dx,OFFSET MS1和MOV ah,09H:用于显示字符串。
IN al,21h和OUT 21h,al:用于与8259A中断控制器进行数据传输。
代码中的条件判断和循环结构
JZ AG:用于等待用户按键。
代码中的异常处理
代码中没有显式的异常处理逻辑,但通过中断处理程序可以处理8259A中断控制器产生的中断。
IRQ |
二、实验电路