8259中断实验详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江工业大学计算机学院
实验报告
实验名称 8259A中断实验
姓名李晓峰
学号 ************
班级物联网1301
教师雷艳静
日期 12.18
一、实验内容与要求
1.1 实验内容
利用8259A芯片,实现中断响应程序。
要求根据单脉冲按键,输出相应的语句:THIS IS THE xxx INTERRUPT! 。
到达中断次数后,屏幕上显示PROGRAM TERMINATED NORMALLY! 1.2 实验要求
(1)第一次按键,输出THIS IS THE 1 st INTERRUPT!;
(2)第二次按键,输出THIS IS THE 2 nd INTERRUPT!;
(3)第十一次按键(特殊),输出THIS IS THE 11 st INTERRUPT!;
(4)以此法继续,直至计数值为零,输出PROGRAM TERMINATED NORMALLY!
二、实验原理与硬件连线
2.1 实验原理
PC用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。
中断控制器用于接收外部的中断请求信号,经过优先级别判别等处理后向CPU发出可屏蔽中断请求。
IBM PC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源。
中断源中断类型号中断功能
IRQ0 08H 时钟
IRQ1 09H 键盘
IRQ2 0AH 保留
IRQ3 0BH 串行口2
IRQ4 0CH 串行口1
IRQ5 0DH 硬盘
IRQ6 0EH 软盘
IRQ7 0FH 并行打印机
8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。
PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级联,对外可以提供16个中断源。
中断源中断类型号中断功能
IRQ8 070H 实时时钟
IRQ9 071H 用户中断
IRQ10 072H 保留
IRQ11 073H 保留
IRQ12 074H 保留
IRQ13 075H 协处理器
IRQ14 076H 硬盘
IRQ15 077H 保留
TPC-USB实验板上,将中断源固定到3号中断IRQ3上,即进行中断实验时,所用中断型号为0BH。
2.2 硬件连线
将TPC-USB实验板上的IQR与8251芯片的IRQ3引脚相连接。
三、设计思路、步骤和程序流程图
3.1 设计思路
要输出“THIS IS THE xxx INTERRUPT!”,必须将字符串分解为3部分,中间部分必须独立输出。
后缀分为“th”,“st”,“nd”,“rd”,必须经过判断后进行匹配。
设置中断向量表,并开放IRQ3的中断屏蔽,同时,将DS指向数据段,便于信息的输出。
设置中断次数,便于测试。
首先,输出中断信息前缀。
对于个位数,与1比较.若为1,输出个位数字和对应后缀“st”。
若大于1,跳转判断是否等于2。
若等于2,输出数字与后缀“nd”。
同理,对于4~9可以直接输出数字和后缀“th”。
若数据为二位数,则要先判断个位数。
而10~19,数字后缀均为“th”,无需判断(特殊情况)。
判断中断计数器的值,为0时屏蔽IRQ3中断,并关中断,结束程序。
否则,中断返回,等待硬中断。
3.2 实验步骤
(1)根据电路图,连接各仪器(中断连IRQ3),并进行硬件检测;
(2)设置中断向量表,并开放IRQ3的中断屏蔽。
(3)等待硬中断。
判断数据个位数字,若为1,设置后缀为“st”;若为2,设置后缀为“nd”;
若为3,设置后缀为“rd”。
特殊情况,11~19时,后缀均为“th”。
(4)判断中断计数器的值,为0时屏蔽IRQ3中断,并关中断,结束程序。
否则,中断返回,
等待硬中断。
3.3 程序流程图
3-1 主程序
3-2 中断服务程序
四、程序清单与执行结果
4.1 程序清单
DATAS SEGMENT
MESS1 DB 'THIS IS THE $'
MESS2 DB 'PROGRAM TERMINATED NORMALLY!',0AH,0DH,'$' MESS4 DB 'ST','$'
MESS3 DB ' INTERRUPT!',0AH,0DH,'$'
STR1 DB 'RD','$'
STR2 DB 'ND','$'
STR3 DB 'TH','$'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DA TAS,SS:STACKS
START:
MOV BX,1
CLI
MOV AX,SEG IRQ3 ;设置中断向量段地址
MOV DS,AX
MOV DX,OFFSET IRQ3 ;设置中断向量偏移地址
MOV AX,250BH ;中断入口地址送中断向量表
INT 21H
IN AL,21H ;读中断屏蔽字
AND AL,0F7H ;开放8259A的IR3中断
OUT 21H,AL
MOV AX,DA TAS
MOV DS,AX ;将DS指向数据段
STI
WIN:
JMP WIN ;等待硬中断
IRQ3:
MOV DX,OFFSET MESS1 ;输出中断信息前缀
MOV AH,9H
INT 21H ;DOS功能调用
CMP BX,9
JA COUT ;中断次数大于9,跳转COUT
C4:
PUSH BX
MOV AX,BX
MOV CL,0AH ;除数为10
DIV CL ;中断次数除以10
MOV CL,AH
ADD AH,30H ;输出高位数字
MOV DL,AH
MOV AH,2H
INT 21H
POP BX ;保存BX
CMP BX,0AH
JB C6 ;小于10,跳转C6
JMP C5 ;跳转C5
C5:
MOV DX,OFFSET STR3 ;DOS功能调用,输出“th”
MOV AH,9H
INT 21H
JMP SEG1 ;跳转SEG1
C6:
CMP CL,1 ;个位数是否为1
JA C1 ;大于1,跳转C1
MOV DX,OFFSET MESS4 ;DOS功能调用,输出“st”
MOV AH,9H
INT 21H
JMP SEG1 ;跳转SEG1
COUT:
MOV AX,BX
MOV CL,0AH
DIV CL ;中断次数除以10
MOV CL,AH
ADD AL,30H ;输出高位
MOV AH,02H
INT 21H
JMP C4 ;跳转C4
C1:
CMP CL,2
JA C2
MOV DX,OFFSET STR2 ;DOS功能调用,输出“nd”
MOV AH,9H
INT 21H
JMP SEG1 ;跳转SEG1
C2:
CMP CL,3
JNZ C3
MOV DX,OFFSET STR1 ;DOS功能调用,输出“rd”
MOV AH,9H
INT 21H
JMP SEG1 ;跳转SEG1
C3:
MOV DX,OFFSET STR3 ;DOS功能调用,输出“th”
MOV AH,9H
INT 21H
JMP SEG1 ;跳转SEG1
SEG1:
MOV DX,OFFSET MESS3
MOV AH,9
INT 21H
INC BX
CMP BX,15 ;比较中断次数
JNZ NEXT ;跳转NEXT,中断返回
IN AL,21H
OUT 21H,AL
MOV DX,OFFSET MESS2 ;输出中断信息后缀
MOV AH,9
INT 21H
MOV AH,4CH
INT 21
NEXT:
MOV AL,20H ;关中断
OUT 20H,AL
IRET ;中断返回
CODES ENDS
END START
4.2 执行结果
(1)第一次按键,输出THIS IS THE 1 st INTERRUPT!;
(2)第二次按键,输出THIS IS THE 2 nd INTERRUPT!;
(3)第十一次按键(特殊),输出THIS IS THE 11 st INTERRUPT!;
(4)以此法继续,直至计数值为零,输出PROGRAM TERMINATED NORMALLY!
4-1 实验结果截图
五、程序调试说明和实验感想
5.1 调试说明
1.按键时,突然到某个点会停止程序。
反复检查程序并没有发现问题,猜测是软件问题。
重新开启程序多次后,该问题可解决(治标不治本,硬件问题)。
2.写代码时,没有考虑到多位数的情况。
比如,尾数为1的数字,一般后缀是”st”;尾数为2的数字,后缀一般是”nd”;尾数为3的数字,后缀一般是”r d”。
然而在10~20之间,统一用的是”th”,这点一开始没考虑到,验收时经老师提醒才发现。
3.汇编的除法很久没有使用,导致AH、AL经常弄错,调试时也不易发现。
AH,AL未使用完时一定要保存,不然容易被DOS功能调用时使用AH而产生复用错误。
5.2 实验感想与收获
1.代码的逻辑性一定要严谨。
这次的代码,跳转、判断很多,稍微粗心一点就会造成错误。
最好先画好每一步的流程,标记每一段的实际作用,方便自己检查错误。
另外,对于CALL、JMP这些功能类似的代码,一定要细心的区分开来,不可混淆使用。
2.熟练使用DOS功能调用。
对于字符串的输出,已经了然于胸。
DOS功能很强大,要善于运用。
MOV DX,OFFSET STR3 ;九号功能输出字符串
MOV AH,9H
INT 21H
5.3 实验特色
这次实验的要求不低,需要考虑的东西比较多。
不同英文的数值后缀需要分别考虑,不能用同一规律一概而论。
比如,11的后缀就不是“st”,而是“th”,这方面一定要注意。
经过老师提醒,我们这方面也完善的比较好了。
另外,由于前缀和后缀都是公共的部分,无需每次都写一段代码,只要逻辑处理妥当,就能减轻代码负担和视觉负担,这方面我们的处理也还是不错的。
5.4 展望
可以设计这样一个程序:按下单脉冲触发器一次,输出所有尾数为1的数字;按下第二次,输出所有尾数为2的数字...... 直到99为止。
保存一个计数值9,即为9次中断。
每个中断服务程序输出9个数字,做好循环输出工作。
2.结合8253计数器,计数值每次减一,进入中断,并输出中断信息。
减到0之后,主程序结束。
10。