汇编语言中断处理程序设计

一、中断处理程序的基本功能#

中断程序设计分为主程序设计和中断处理程序设计两部分。

  1. 主程序设计

主程序设计中要注意的问题如下所示。

(1)设置中断向量,把中断处理程序的入口地址存入中断向量表,设置中断向量可以直接用 MOV 指令完成,也可以用 DOS 系统功能调用完成,方法在前面已作介绍。

(2)设置中断优先级和中断屏蔽位,对 8259A 的中断命令寄存器和中断屏蔽寄存器进行设置,方法在前面也已作介绍。或选择默认状态设置。

(3)中断系统的其他初始化,即中断控制器 8259A 的初始化和外设接口的初始化。

(4)开中断。

此后,如果有中断请求发生,CPU 就可以响应。

  1. 中断处理程序设计

中断处理程序的编写方法和标准子程序很类似,在中断处理程序中要注意的问题如下:

(1)保存寄存器的内容;

(2)如允许中断嵌套,则开中断(STI);

(3)处理过程,这是中断处理程序的主体部分,与实际应用和服务对象有关;

(4)关中断(CLI),这是为了在中断处理结束,即将返回时不受新的中断干扰;

(5)恢复寄存器的内容;

(6)发中断结束命令(EOI);

(7)返回被中断的程序(IRET)。

二、中断处理程序设计举例#

例 3 用定时器作为中断源产生中断,使得在主程序运行期间,每隔 1 秒执行一个中断处理程序,显示‘THE TIME IS :’和次数。

在系统定时器(中断类型号=8)中断处理程序中,有一条 INT 1CH 指令,时钟每发生一次中断(约每秒中断 18 次),都要执行一次 INT 1CH 指令,进行 BIOS 调用,实际上 1CH 的处理程序中只有一条 IRET 指令,没有做任何工作。我们可以利用这个中断类型号,设计中断处理程序。在程序任务结束时,恢复系统原状。

需要设计主程序MAIN和中断处理程序 TIME 两部分。

主程序 MAIN 主要做如下工作:

(1)把原 1CH 的中断向量从中断向量表中取出,保存到堆栈;

(2)设置中断处理程序TIME的中断向量到中断向量表;

(3)设置中断屏蔽寄存器,开放系统时钟;

(4)开中断;

(5)用一段程序实现延时,以便在此期间捕获时钟中断;

(6)设置原 1CH 的中断向量到中断向量表。

中断处理程序 TIME 主要做如下工作:

(1)保存需要使用的寄存器内容;

(2)开中断;

(3)因为时钟中断约每秒发生 18 次中断请求,所以须控制每隔 18 次时钟中断才进行一次显示信息,以得到每隔 1 秒显示信息的效果,这是中断处理程序的主体部分;

(4)关中断;

(5)恢复寄存器的内容;

(6)返回被中断的程序。

程序如下:

DATA  SEGMENT

COUNT DW 18

MESS DB 'THE TIME IS:',30H,13,10,'$'

DATA  ENDS

CODE  SEGMENT

MAIN  PROC  FAR

ASSUME CS:CODE,DS:DATA,ES:DATA

PUSH DS

XOR AX,AX

PUSH AX

; 把原1CH的中断向量从中断向量表中取出,保存到堆栈

MOV AL,1CH

MOV AH,35H

INT 21H

PUSH ES

PUSH BX

PUSH DS

; 设置中断处理程序TIME的中断向量到中断向量表

MOV DX,OFFSET TIME

MOV AX,SEG TIME

MOV DS,AX

MOV AL,1CH

MOV AH,25H

INT 21H

POP DS

IN  AL,21H

; 设置中断屏蔽字,开放时钟中断

AND AL,11111110B

OUT 21H,AL

STI

; 用循环程序实现延时,以便在此期间捕获时钟中断,循环计数初值根据机器情况设置

MOV DI,1000

DELAY:

MOV SI,0000

DELAY1:

DEC SI

JNZ DELAY1

DEC DI

JNZ DELAY

; 延时结束,恢复原1CH的中断向量到中断向量表

POP DX

POP DS

MOV AL,1CH

MOV AH,25H

INT 21H

RET

MAIN  ENDP

; 中断处理程序TIME:

TIME  PROC NEAR

PUSH DS

PUSH AX

PUSH CX

PUSH DX

MOV AX,DATA

MOV DS,AX

STI

; 每18次中断显示一次信息

DEC COUNT

JNZ EXIT

; 显示信息,MESS+12的内存中初始值是0的ASCII码

INC MESS+12

MOV DX,OFFSET MESS

MOV AH,09

INT 21H

; 用计数值18控制显示的时间间隔

MOV COUNT,18

EXIT: CLI

POP DX

POP CX

POP AX

POP DS

IRET

TIME  ENDP

CODE  ENDS

END MAIN

(完)

comments powered by Disqus