在中断驻留程序中不能用int 21h吗

vn68214 2007-06-21 11:26:02
一个简单的中断驻留程序修改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
...全文
194 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2007-06-22
  • 打赏
  • 举报
回复
如上所述,dos内核一般不可重入
zara 2007-06-22
  • 打赏
  • 举报
回复
嗯, 基本上就是这个意思. dos 内核是不可再入的, 即在 dos 处理到内核状态时, 不能再次调用同类的 dos 中断, 主要是内部数据结构的固定性造成的. 一般的解决方法可以是暂时搁置功能调用, 等等 dos 空闲时再调用; 或者是复制出来 dos 内部核心数据区, 调用自己的功能, 恢复原来的核心数据. 更详尽的方法步骤, 可以用 "dos中断重入" 之类的关键字网上搜索一下

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧