首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

在中断驻留程序中不能用int 21h吗,该怎么处理

2012-02-03 
在中断驻留程序中不能用int 21h吗一个简单的中断驻留程序修改9号中断多打一个O,我发现如果把movdl, Omovah

在中断驻留程序中不能用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中断重入 " 之类的关键字网上搜索一下

热点排行