|
|
![]() |
|
2、设置中断向量
(1)、DOS功能调用的方法
中断21H之功能25H可为指定的中断号设置新的入口地址。其使用方法如下:
入口参数:AH=中断号,DS:DX=中断处理程序的入口地址
出口参数:无
例8.17 用功能调用的方法把子程序NewFunc设置为中断n的中断处理程序。
解: | ||||
…… | ||||
NewFunc | PROC | |||
…… | ||||
IRET | ;注意其返回指令 | |||
NewFunc | ENDP | |||
…… | ||||
MOV | AX, SEG NewFunc | |||
MOV | DS, AX | ;设置段地址寄存器 | ||
MOV | DX, OFFSET NewFunc | ;设置偏移量 | ||
MOV | AL, n | ;这里的n要用具体的中断号来定 | ||
MOV | AH, 25H | |||
INT | 21H | |||
…… |
(2)、直接访问存储单元的方法
例8.18 用直接访问存储单元的方法把子程序NewFunc设置为中断n的中断处理程序。
解: | ||||
…… | ||||
NewFunc | PROC | |||
NewFunc | …… | |||
IRET | ;注意其返回指令 | |||
ENDP | ||||
…… | ||||
MOV | AX, 0H | |||
MOV | DS, AX | |||
MOV | BX, 4*n | |||
CLI | ||||
MOV | word ptr [BX], OFFSET NewFunc | ;设置中断处理程序的偏移量 | ||
MOV | word ptr [BX+2], SEG NewFunc | ;设置中断处理程序的段地址 | ||
STI | ||||
…… |
在上面程序段中,指令CLI是一条值得注意的指令,它用来确保随后二条MOV指令被连续执行而不被打断。这是因为执行其第一条MOV指令后,原中断向量表中的入口地址就被破坏了,这时,该入口地址既不是指向原处理程序,也不指向新处理程序。如果此刻正巧发生了该类型的中断请求,那么,系统将转向一个非法的位置。如果程序员能确信此时不会发生该类型的中断请求,当然也就不必插入关中断指令。
后面的指令STI是开中断指令,它允许CPU响应其后的中断请求。