中断服务程序设计实验
2.7.1 实验目的
1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。
2、 掌握中断服务程序的设计方法。
2.7.2 实验预习要求
1、 复习中断的有关内容。
2、 复习中断服务程序设计方法。
3、 读懂“2.7.4 实验内容”中给出的源程序,以便上机调试。
4、 从“2.7.5 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.7.3 中断服务程序设计方法简介
由2.6节中的中断向量表可以看出,PC中断系统中中断类型可分为三类:
磁盘操作系统DOS提供的中断服务程序,中断类型号从20H到2FH;
系统主板BIOS芯片提供的BIOS中断服务程序,包括系统内部中断,中断类型号从00H到07H;系统8级外部中断,中断类型号从08H到0FH,它们对应于接在可编程中断控制器8259A的8个中断请求输入端IR0IR7的8个外部中断,其中IR2(中断类型号0AH)为系统保留,用户可通过该引脚实现对用户所需的外部硬件中断的管理;设备驱动程序,中断类型号从10H到1FH等;
用户定义的中断,中断类型号从60H到7FH、F1H到FFH。用户可根据实际需要将某些通用性强的子程序功能通过中断服务程序来实现。一旦设置好了这样的中断服务程序,在其他应用程序中就可以调用这些中断服务程序。
设计中断服务程序的步骤如下:
1、 选择一个中断类型号
如果采用硬件中断,则要使用硬件决定的中断类型号。在PC机系统中,使用了一片可编程中断控制器8259A来对外部硬件中断进行管理,具体内容参见教材264页“8259A应用举例”,可以看出IR2为系统保留,其中断类型号为0AH。若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断请求信号时,系统就会根据得到的类型号(0AH)到中断向量表中找出其入口地址,并转去执行该中断服务程序。
如果采用软件中断,即利用执行int n指令的方式执行中断服务程序,则可从系统预留给用户的中断类型号60H7FH、F1HFFH中选择一个。
2、 将中断服务程序的入口地址置入中断向量表的相应的四个存储单元中
确定了中断类型号,还要把中断服务程序入口地址置入中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务程序。下面介绍两种将中断服务程序入口地址置入中断向量表的方法。
(1) 直接装入法
用传送指令直接将中断服务程序首地址置入矢量表中。设中断类型号为60H(此类型号对应的矢量表地址为从00180H开始的四个连续存储单元)。
PUSH DS
XOR AX,AX
MOV DS,AX ;将数据段寄存器清零
MOV AX,OFFSET INT60 ;将中断服务程序INT60所在段内的偏移地址送AX
MOV DS:[0180H],AX ;将中断服务程序偏移地址送中断向量表00180H和00181单元
MOV AX,SEG INT60 ;将中断服务程序INT60所在段的段地址送AX
MOV DS:[0180H+2],AX ;将中断服务程序所在代码段的段地址送00182H和00183单元
POP DS
(2) DOS系统功能调用法
功能号(AH)=25H;
入口参数:(AL)=中断类型号,
(DS)=中断服务程序入口地址的段地址
(DX)=中断服务程序入口地址的偏移地址
下面程序段完成中断类型号为60H的入口地址置入。
PUSH DS ;保护DS
MOV DX,OFFSET INT60 ;取服务程序偏移地址
MOV AX,SEG INT60 ;取服务程序段地址
MOV DS,AX
MOV AH,25H ;送功能号
MOV AL,60H ;送中断类型号
INT 21H ;DOS功能调用
POP DS ;恢复DS
3、 使中断服务程序驻留内存,以便其他应用程序调用
实现这一步骤的必要性在于:一旦中断服务程序驻留内存后,一般程序员使用这一新增的中断调用就如同调用DOS或BIOS的中断子程序一样,只要了解其入口要求和返回参数就可调用。程序驻留在内存后,它占用的存储区就不会被其他软件覆盖。使程序驻留内存,要求该程序以 .COM形式运行,这种种结构的程序要求入口定位于100H,并且数据和代码均在同一个段内,这样,.COM程序就被定位于低地址区,DOS常在低地址区增加驻留程序,而 .EXE程序被定位于高地址区。
可采用DOS系统功能调用的方法实现程序驻留内存。
功能号: (AH)=31H;
入口参数: (DX)=驻留程序字节数
该功能使当前程序的DX个字节驻留内存并返回DOS。
2.7.4 实验内容
编写一中断服务程序完成(AX)+(BX)结果放在(AX)中。要求中断类型号取60H;使用DOS系统功能调用将中断服务程序AX_BX60的入口地址装入中断向量表;使用INT 60H调用该中断服务程序并用DEBUG观察运行结果是否正确。
程序框架
CODE SEGMENT
ASSUME CS: CODE
START:
MOV AX, 01H
MOV BX, 02H
INT 60H ;通过软中断指令调用中断服务程序实现(AX)+(BX)
MOV AH, 4CH
INT 21H ;返回DOS
;
AX_BX60 PROC FAR ;中断服务程序
ADD AX, BX
IRET
AX_BX60 ENDP
CODE ENDS
END START
对上述源程序汇编连接生成*.EXE文件,使用TD观察运行结果,如图所示,执行完INT 60H后,AX寄存器的内容为0003H,结果正确。