一. 实验目的
- 掌握PC机中断处理系统的基本原理。
- 学会编写中断服务程序。
- 掌握扩展查询方法。
二. 实验内容
硬件平台:TPC-ZK-II配套试验箱
软件环境:TPC-ZK-II
实验3-1 中断服务实验
实验要求:
参照实验电路图,编写IRQ10的中断程序。实现直接用手动产生单脉冲作为中断请求信号。要求每按一次开关产生一次中断,在屏幕上显示一次“IRQ10!”,中断10次后程序退出。
电路图:
接线:
汇编代码:
DATA SEGMENT
MESS DB 'IRQ10!',0DH,0AH,'$' ;定义名为MESS的字符串,内容为IRQ10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA ;建立段寄存器寻址
START:
MOV AX,CS ;将CS中的值送入AX中暂存
MOV DS,AX ;将AX中的值送入DS中
MOV DX,OFFSET INT10 ;设置中断程序段INT10的入口偏移量,并送入DX中
MOV AX,2572H ;设置IRQ10的中断向量,设置完后,识别到有72h的中断类型号,会根据DS:DX的中断向量执行相应的中断服务程序
INT 21H ;中断,输出
IN AL,21H ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
AND AL,0FBH ;取消屏蔽D2的中断,1111 1011
OUT 21H,AL ;写回主片改变后的屏蔽字
IN AL,0A1H ;从从片端口地址0A1H读入中断屏蔽器的当前屏蔽字
AND AL,0FBH ;取消屏蔽D2的中断,1111 1011
OUT 0A1H,AL ;写回从片改变后的屏蔽字
MOV CX,10 ;设置中断循环次数为10次,由CX储存
STI ;恢复中断,设置中断标志位
LL:
JMP LL ;等待脉冲
INT10:
MOV AX,DATA ;将DATA数据段送入AX寄存器中暂存
MOV DS,AX ;将AX寄存器中的数据送入DS中
MOV DX,OFFSET MESS ;取得MESS数据存储区的首地址并送入DX寄存器中
MOV AH,09 ;调用DOS的9号功能,显示每次中断的提示信息
INT 21H ;中断,输出中断提示信息
MOV AL,20H ;从端口地址20H读入ISR内容送入AL
OUT 20H,AL ;主片发出EOI结束命令
OUT 0A0H,AL ;从片发出EOI结束命令
LOOP NEXT ;循环执行NEXT,直到中断程序的远返回
IN AL,21H ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
OR AL,04H ;屏蔽D2的中断,0000 0100
OUT 21H,AL ;写回主片改变后的屏蔽字
IN AL,0A1H ;从从片端口地址0A1H读入中断屏蔽器的当前屏蔽字
OR AL,04H ;屏蔽D2的中断,0000 0100
OUT 0A1H,AL ;写回从片改变后的屏蔽字
STI ;恢复中断,设置中断标志位
MOV AH,4CH ;返回DOS
INT 21H ;中断,退出,输出done
NEXT: IRET ;指令执行到中断程序的远返回
CODE ENDS
END START
运行结果:
实验3-2 中断嵌套实验
实验要求:
采用查询方式,参考电路图编制程序,编写IRQ3和IRQ10的中断嵌套程序,每按一次单脉冲进行一次中断,屏幕上显示相应的中断请求号“IRQ3”或“IRQ10”,进行IRQ10或者IRQ3中断操作,在屏幕显示中断信息时,按下另一个脉冲按钮,进行中断,屏幕上中断信息会被打断,进而显示另一个中断类型的中断信息。
电路图:
接线:
汇编代码:
DATA SEGMENT
MESS DB 'IRQ10!',0DH,0AH,'$' ;定义名为MESS的字符串,内容为IRQ10
MEES DB 'IRQ3!',0DH,0AH,'$' ;定义名为MESS的字符串,内容为IRQ3
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS:DATA
.386
START:
MOV AX,CS ;将CS中的值送入AX中暂存
MOV DS,AX ;将AX中的值送入DS中
MOV DX,OFFSET INT10 ;设置中断程序段INT10的入口偏移量,并送入DX中
MOV AX,2572H ;设置IRQ10的中断向量,设置完后,识别到有72h的中断类型号,会根据DS:DX的中断向量执行相应的中断服务程序
INT 21H ;中断,输出
MOV DX,OFFSET INT3 ;设置中断程序段INT3的入口偏移量,并送入DX中
MOV AX,250BH ;设置IRQ3的中断向量,设置完后,识别到有0Bh的中断类型号,会根据DS:DX的中断向量执行相应的中断服务程序
INT 21H ;中断,输出
IN AL,21H ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
AND AL,0F3H ;取消屏蔽D2和D3的中断,1111 0011
OUT 21H,AL ;写回主片改变后的屏蔽字
IN AL,0A1H ;从从片端口地址0A1H读入中断屏蔽器的当前屏蔽字
AND AL,0FBH ;取消屏蔽D2的中断,1111 1011
OUT 0A1H,AL ;写回从片改变后的屏蔽字
MOV CX,10 ;设置中断循环次数为10次,由CX储存
STI ;恢复中断,设置中断标志位
LL:
JMP LL ;等待脉冲
INT10:
PUSHAD ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
PUSHFD ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
MOV CX,10 ;设置中断循环次数为10次,由CX储存
MOV AX,DATA ;将DATA数据段送入AX寄存器中暂存
MOV DS,AX ;将AX寄存器中的数据送入DS中
CC:
MOV DX,OFFSET MESS ;取得MESS数据存储区的首地址并送入DX寄存器中
MOV AH,09 ;调用DOS的9号功能,显示每次中断的提示信息
INT 21H ;中断,输出中断提示信息
CALL DELAY ;调用延时子程序DELAY
LOOP CC ;循环执行CC
MOV AL,20H ;从主片端口地址20H读入ISR内容送入AL
OUT 20H,AL ;主片发出EOI结束命令
MOV AL,0A0H ;从从片端口地址0A0H读入ISR内容送入AL
OUT 0A0H,AL ;从片发出EOI结束命令
IN AL,21H ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
OR AL,04H ;屏蔽D2的中断,0000 0100
OUT 21H,AL ;写回主片改变后的屏蔽字
OUT 0A1H,AL ;写回从片改变后的屏蔽字
POPFD ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
POPAD ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
STI ;恢复中断,设置中断标志位
IRET ;指令执行到中断程序的远返回
MOV AH,4CH ;返回DOS
INT 21H ;中断,退出
INT3:
PUSHAD ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
PUSHFD ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
MOV CX,10 ;设置中断循环次数为10次,由CX储存
MOV AX,DATA ;将DATA数据段送入AX寄存器中暂存
MOV DS,AX ;将AX寄存器中的数据送入DS中
BB:
MOV DX,OFFSET MEES ;取得MESS数据存储区的首地址并送入DX寄存器中
MOV AH,09 ;调用DOS的9号功能,显示每次中断的提示信息
INT 21H ;中断,输出中断提示信息
CALL DELAY ;调用延时子程序DELAY
LOOP BB ;循环执行BB
MOV AL,20H ;从主片端口地址20H读入ISR内容送入AL
OUT 20H,AL ;主片发出EOI结束命令
IN AL,21H ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
OR AL,08H ;屏蔽D3的中断,0000 1000
OUT 21H,AL ;写回主片改变后的屏蔽字
POPFD ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
POPAD ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
STI ;恢复中断,设置中断标志位
IRET ;指令执行到中断程序的远返回
MOV AH,4CH ;返回DOS
INT 21H ;中断,退出
DELAY PROC NEAR ;延时子程序DELAY开始定义
PUSH BX ;将BX中内容入栈
PUSH CX ;将CX中内容入栈
MOV BX,100H ;将100H送入BX中
lll:
MOV CX,0 ;将0送入CX中
llLL:
LOOP llLL ;循环执行llLL
DEC BX ;BX中内容自减
JNE lll ;跳转至lll
POP CX ;将CX中内容出栈
POP BX ;将BX中内容出栈
RET ;修改IP实现近转移
DELAY ENDP ;延时子程序DELAY结束定义
CODE ENDS
END START
运行结果: