⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 中断矢量设置与读取有关的dos功能调用.txt

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


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -