在中断驻留程序中不能用int 21h吗
一个简单的中断驻留程序修改9号中断多打一个O,我发现如果把
mov dl, 'O '
mov ah,2
int 21h
改为
mov ah,0Eh
int 10h
mov al, 'O '
就没问题,难道在中断驻留程序中不能用int 21h吗
INT_VECTOR=9h
cseg segment
assume cs:cseg,ds:cseg
org 100h ;this line could be deleted for EXE,only for COM
begin:
jmp install
kbsave dd ?
newint9 proc near
sti; 开中断, enable high level IRQ interrupt
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
pushf
call dword ptr cs:kbsave ;EXCUTE OLD INT 9
mov dl, 'o '
mov ah,2
int 21h
exit:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
newint9 endp
install proc near
xor ax,ax
mov es,ax
mov ax,word ptr es:[INT_VECTOR*4] ;save old int 9 vector
mov word ptr cs:kbsave,ax
mov ax,word ptr es:[INT_VECTOR*4+2]
mov word ptr cs:kbsave+2,ax
xor ax,ax
mov es,ax
mov ax,offset newint9 ;set new int 9 vector
mov word ptr es:[INT_VECTOR*4],ax
mov word ptr es:[INT_VECTOR*4+2],cs
MOV AX,3100H
LEA DX,install
ADD DX,100h ;must include PSP for EXE, as PSP!=CS for EXE
;but this line could be deleted for COM
MOV CL,4
SHR DX,CL;convert byte to paragraph
INC DX;consideration of the remainder
INT 21h
;mov DX,OFFSET INSTALL
;INT 27H
install endp
cseg ends
end begin
[解决办法]
嗯, 基本上就是这个意思. dos 内核是不可再入的, 即在 dos 处理到内核状态时, 不能再次调用同类的 dos 中断, 主要是内部数据结构的固定性造成的. 一般的解决方法可以是暂时搁置功能调用, 等等 dos 空闲时再调用; 或者是复制出来 dos 内部核心数据区, 调用自己的功能, 恢复原来的核心数据. 更详尽的方法步骤, 可以用 "dos中断重入 " 之类的关键字网上搜索一下