与中断矢量设置与读取有关的DOS功能调用

源代码在线查看: 中断矢量设置与读取有关的dos功能调用.txt

软件大小: 5 K
上传用户: Sundaymorn
关键词: DOS 中断 矢量 读取
下载地址: 免注册下载 普通下载 VIP

相关代码

				与中断矢量设置与读取有关的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
				
				
							

相关资源