?? 中斷矢量設置與讀取有關的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 + -