与中断矢量设置与读取有关的DOS功能调用
源代码在线查看: 中断矢量设置与读取有关的dos功能调用.txt
与中断矢量设置与读取有关的DOS功能调用如下:
①设置中断矢量:(25H号调用)
入口参数:AH=25H,AL=中断类型号,DS:DX=中断矢量
出口参数:无
②读取中断矢量:(35H号调用)
入口参数:AH=35H,AL=中断类型号
出口参数:ES:BX=中断矢量
例1中断服务程序的安装与调用
本例演示了如何编写中断服务程序,如何安装(将中断服务程序的地址设置到中断矢表中),以及如何通过软中断指令调用中断服务程序。为了突出重点,本例中中断服务程序代码未驻留内存。
CODE SEGMENT
ASSUME CS:CODE
INT_START: 以下是中断服务程序代码,它在屏幕上显示10个*号
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,2 ;置光标位置
MOV BH,0 ;页号0
MOV DH,20 ;行号为20
MOV DL,25 ;列号为25
INT 10H
MOV AH,9 ;显示字符
MOV AL,'*' ;显示字符ASCII码
MOV BH,0 ;设置页号
MOV BL,7 ;字符属性
MOV CX,10 ;重复次数
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET ;中断服务程序到此结束
START:
MOV AH,25H ;安装中断服务程序的DOS调用
MOV AL,67H ;欲安装的中断服务类型号
PUSH CS
POP DS ;中断服务程序的段地址(在CS内)赋给DS
MOV DX,OFFSET INT_START ;中断服务程序的偏移量赋给DX
INT 21H ;进行中断服务程序的设置调用
INT 67H ;调用67H号中断
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
例2 驻留内存的中断服务程序
在上例中,当程序结束后,其所占内存被DOS收回,中断服务程序即不再可用。若想让程序退出后中断服务程序所占内存仍然保留,以便为后续程序提供中断服务,则必须让中断服务程序驻留内存。
DOS的功能调用31H可实现终止并驻留内存。
入口参数:DX=驻留内存节数
AL=退出码(如果后续程序不用,可任意设置)
出口参数:无
DX中要指出节数而不是字节数,一节等于16个字节。设需要驻留部分长度为n个字节,则计算公式为:
DX=(n÷16)+1+16
上式中加1是为了防止n不是16整数倍时将余数部分考虑上,再加16是因为DOS在启动应用程序时会在程序前加上一程序段前缀PSP(DOS管理程序用的数据结构),它需要和程序一块驻留内存,PSP占256字节,正好是16节。
以下程序运行后将自己驻留部分的地址登记在中断矢量表中5号中断位置处,从而用自己的中断服务程序替换了系统原先的5号中断服务程序。5号中断为屏幕打印中断,当按键盘上的PrintScreen键时,会触发这一中断。旧的中断服务程序(BIOS提供)的功能是将屏幕内容拷贝到打印机上,而我们的程序将其替换后,按PrintScreen键时,将不再打印屏幕,而是在屏幕上显示一个星号。
CODE SEGMENT
ASSUME CS:CODE
INT_START: 以下是中断服务程序代码,它在屏幕上显示一个*号
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0EH ;显示字符
MOV AL,'*' ;显示字符ASCII码
MOV BL,0 ;字符属性
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET 中断服务程序到此结束
START:
PUSH CS
POP DS ;中断服务程序的段地址(在CS内)赋给DS
MOV DX,OFFSET INT_START ;中断服务程序的偏移量赋给DX
MOV AH,25H
MOV AL,05H
INT 21H ;调用中断服务程序设置功能
MOV DX,START-INT_START ; START-INT_START为需要驻留部分长度
MOV CL,4
SHR DX,CL ;右移4位,即除以16
ADD DX,11H ;加上17
MOV AH,31H
INT 21H ;终止并驻留
CODE ENDS
END START
例3 驻留内存的中断服务程序
进入中断服务程序
new1ch proc
sti ;开中断
push si ;保护寄存器
push ds
mov si,cs
mov ds,si ;设置数据段DS
add countl,1
adc counth,0
中断处理
cmp countl,hourl
jnz n1ch1
cmp counth,hourh
jnz n1ch1
mov countl,0
mov counth,0
mov si,offset intmsg
call dpstri
退出中断服务程序
n1ch1: pop ds ;恢复寄存器
pop si
iret ;中断返回
countl dw 0
counth dw 0
intmsg db ‘One Hour Has Passed ! ’
db 0dh,0ah,0
new1ch endp
显示字符串
dpstri proc ;显示字符串子程序
push ax
push bx
dps1: lodsb
cmp al,0
jz dps2
显示字符串(续)
mov bx,0
mov ah,0eh
int 10h
jmp dps1
dps2: pop bx
pop ax
ret
dpstri endp
主程序开始
start: mov ax,cs
mov ds,ax
mov dx,offset new1ch
cli
mov ax,251ch
int 21h
sti
mov dx,offset tsrmsg
mov ah,09h
int 21h
主程序结束
mov dx, start-new1ch
mov cl,4
shr dx,cl
add dx,11h
mov ax,3100h ;程序驻留
int 21h
tsrmsg db ‘INT 1CH Program Installed !’
db 0dh,0ah,'$'
end start