關於修改中斷問題
cmp ah,02h ;當AH不為02時,仍執行原來的21H功能,
jne next ;通過遠跳轉跳來調用原來的中斷處理程序
錯壹:字符07H,08H,0AH,0DH不可顯示,需要特別處理。
sti
push bx /push cx /push ax
xor ax,ax /mov al,dl
錯二:XOR是異或運算,將影響標誌位,所以中斷入、出口
要保存標誌,添上PUSHF/POPF。
mov bl,16
div bl /add al,'0' /add ah,'0'
錯三:除、加影響標誌位,錯誤類型同上。
mov result[0],al /mov result[1],ah
錯四:!致命錯誤*1!應用程序調用時是顯示1個字節字符,妳顯示的
卻是壹串不定長的字串,這將打亂原來屏幕的字符排列。
push dx
lea dx,result
錯五:result db 2 dup(?),32,13,10 後面沒有'$'(36D=24H),字串
輸出結果不可預期。
mov ah,09h /int 21h
錯六:中斷遞歸調用,後果不可預期。
pop dx /pop ax /pop cx /pop bx
cli
iret
next:
lea si,off ;通過跳轉執行原來的中斷處理程序
jmp dword ptr [si]
錯七:中斷未重定向數據段段址,這壹跳,必定死機。
tran endp
main proc far
mov ax,data /mov ds,ax
push es ;保存中斷21H的入口地址在segm:off裏
mov ah,35h /mov al,21h /int 21h
mov ax,es /mov segm,ax /mov off,bx
pop es
cli
mov ah,25h ;設置21H為自己編寫的中斷程序tran
mov al,21h /lea dx,tran /mov bx,seg tran
push ds /mov ds,bx /int 21h
pop ds
sti
lea dx,info /mov ah,09h /int 21h
mov dl,61h /mov ah,02h /int 21h ;恢復原來的21H功能
錯七:※
ぶΞ
,上壹句,我不知所雲,無話可說。
cli
mov bx,segm /mov dx,off
push ds /mov ds,bx
mov ah,25h /mov al,21h /int 21h
pop ds
sti
mov ax,4c00h /int 21h
錯八:!致命錯誤*2!4C是程序正常退出,DOS將收回妳運行時的內存,
妳改了中斷向量表,壹走了之;電腦也只好死了死了,壹死百了!
main endp
下面是完整替換Int21H 2號功能的程序,可資參考。
妳可用DEBUG再匯編成壹COM文件,保存後運行壹下。
CS: IP: 匯編代碼:
0B22:0100 EB3E JMP 0140
0B22:0102 0100 ADD [BX+SI],AX
0B22:0104 0000 ADD [BX+SI],AL
0B22:0106 0000 ADD [BX+SI],AL
0B22:0108 0000 ADD [BX+SI],AL
0B22:010A 0000 ADD [BX+SI],AL
0B22:010C 0000 ADD [BX+SI],AL
0B22:010E 0000 ADD [BX+SI],AL
0B22:0110 0000 ADD [BX+SI],AL
0B22:0112 0000 ADD [BX+SI],AL
0B22:0114 0000 ADD [BX+SI],AL
0B22:0116 0000 ADD [BX+SI],AL
0B22:0118 FB STI
0B22:0119 9C PUSHF
0B22:011A 50 PUSH AX
0B22:011B 80FC02 CMP AH,02
0B22:011E 750B JNZ 012B
0B22:0120 88D0 MOV AL,DL
0B22:0122 B40E MOV AH,0E
0B22:0124 CD10 INT 10
0B22:0126 58 POP AX
0B22:0127 9D POPF
0B22:0128 FA CLI
0B22:0129 CF IRET
0B22:012A 90 NOP
0B22:012B 58 POP AX
0B22:012C 9D POPF
0B22:012D 2E CS:
0B22:012E FF2E1001 JMP FAR [0110]
0B22:0132 90 NOP
0B22:0133 0000 ADD [BX+SI],AL
0B22:0135 0000 ADD [BX+SI],AL
0B22:0137 0000 ADD [BX+SI],AL
0B22:0139 0000 ADD [BX+SI],AL
0B22:013B 0000 ADD [BX+SI],AL
0B22:013D 0000 ADD [BX+SI],AL
0B22:013F 000E1FB8 ADD [B81F],CL
0B22:0143 90 NOP
0B22:0144 35CD21 XOR AX,21CD
0B22:0147 83FB00 CMP BX,+00
0B22:014A 740B JZ 0157
0B22:014C BAB001 MOV DX,01B0
0B22:014F B409 MOV AH,09
0B22:0151 CD21 INT 21
0B22:0153 B44C MOV AH,4C
0B22:0155 CD21 INT 21
0B22:0157 B82135 MOV AX,3521
0B22:015A CD21 INT 21
0B22:015C 891E1001 MOV [0110],BX
0B22:0160 8C061201 MOV [0112],ES
0B22:0164 06 PUSH ES
0B22:0165 1F POP DS
0B22:0166 89DA MOV DX,BX
0B22:0168 B89025 MOV AX,2590
0B22:016B CD21 INT 21
0B22:016D 0E PUSH CS
0B22:016E 1F POP DS
0B22:016F BA1801 MOV DX,0118
0B22:0172 B82125 MOV AX,2521
0B22:0175 CD21 INT 21
0B22:0177 BA9001 MOV DX,0190
0B22:017A B409 MOV AH,09
0B22:017C CD21 INT 21
0B22:017E BA3801 MOV DX,0138
0B22:0181 83C20F ADD DX,+0F
0B22:0184 B104 MOV CL,04
0B22:0186 D3EA SHR DX,CL
0B22:0188 B80031 MOV AX,3100
0B22:018B CD21 INT 21
0B22:018D 0000 ADD [BX+SI],AL
0B22:018F 00496E ADD [BX+DI+6E],CL
0B22:0192 7374 JNB 0208
0B22:0194 61 DB 61
0B22:0195 6C DB 6C
0B22:0196 6C DB 6C
0B22:0197 65 DB 65
0B22:0198 64 DB 64
0B22:0199 205365 AND [BP+DI+65],DL
0B22:019C 63 DB 63
0B22:019D 63 DB 63
0B22:019E 65 DB 65
0B22:019F 7373 JNB 0214
0B22:01A1 66 DB 66
0B22:01A2 756C JNZ 0210
0B22:01A4 210D AND [DI],CX
0B22:01A6 0A24 OR AH,[SI]
0B22:01A8 0000 ADD [BX+SI],AL
0B22:01AA 0000 ADD [BX+SI],AL
0B22:01AC 0000 ADD [BX+SI],AL
0B22:01AE 0000 ADD [BX+SI],AL
0B22:01B0 41 INC CX
0B22:01B1 6C DB 6C
0B22:01B2 7265 JB 0219
0B22:01B4 61 DB 61
0B22:01B5 64 DB 64
0B22:01B6 7920 JNS 01D8
0B22:01B8 49 DEC CX
0B22:01B9 6E DB 6E
0B22:01BA 7374 JNB 0230
0B22:01BC 61 DB 61
0B22:01BD 6C DB 6C
0B22:01BE 6C DB 6C
0B22:01BF 65 DB 65
0B22:01C0 64 DB 64
0B22:01C1 210D AND [DI],CX
0B22:01C3 0A24 OR AH,[SI]
0B22:01C5 0000 ADD [BX+SI],AL
0B22:01C7 0000 ADD [BX+SI],AL