在中断驻留程序中不能用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
...全文
202 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2007-06-22
  • 打赏
  • 举报
回复
如上所述,dos内核一般不可重入
zara 2007-06-22
  • 打赏
  • 举报
回复
嗯, 基本上就是这个意思. dos 内核是不可再入的, 即在 dos 处理到内核状态时, 不能再次调用同类的 dos 中断, 主要是内部数据结构的固定性造成的. 一般的解决方法可以是暂时搁置功能调用, 等等 dos 空闲时再调用; 或者是复制出来 dos 内部核心数据区, 调用自己的功能, 恢复原来的核心数据. 更详尽的方法步骤, 可以用 "dos中断重入" 之类的关键字网上搜索一下
服务程序设计实验 2.7.1 实验目的 1、 熟悉的概念、响应过程、向量表以及系统是如何根据类型号在向量表得到该对应的服务程序的入口地址等内容。 2、 掌握服务程序的设计方法。 2.7.2 实验预习要求 1、 复习的有关内容。 2、 复习服务程序设计方法。 3、 读懂“2.7.4 实验内容”给出的源程序,以便上机调试。 4、 从“2.7.5 实验习题”任选一道题目,编写源程序,以便上机调试。 2.7.3 服务程序设计方法简介 由2.6节向量表可以看出,PC系统类型可分为三类: 磁盘操作系统DOS提供的服务程序类型号从20H到2FH; 系统主板BIOS芯片提供的BIOS服务程序,包括系统内部类型号从00H到07H;系统8级外部类型号从08H到0FH,它们对应于接在可编程控制器8259A的8个请求输入端IR0IR7的8个外部,其IR2(类型号0AH)为系统保留,用户可通过该引脚实现对用户所需的外部硬件的管理;设备驱动程序类型号从10H到1FH等; 用户定义的类型号从60H到7FH、F1H到FFH。用户可根据实际需要将某些通用性强的子程序功能通过服务程序来实现。一旦设置好了这样的服务程序,在其他应用程序就可以调用这些服务程序。 设计服务程序的步骤如下: 1、 选择一个类型号 如果采用硬件,则要使用硬件决定的类型号。在PC机系统,使用了一片可编程控制器8259A来对外部硬件进行管理,具体内容参见教材264页“8259A应用举例”,可以看出IR2为系统保留,其类型号为0AH。若用户需要,可将用户所需的外部源发来的请求信号接到IR2,编写该所需的服务程序,并将该服务程序的入口地址写到向量表0AH4AH4+3四个单元,这样,当接在IR2上的外部源发来请求信号时,系统就会根据得到的类型号(0AH)到向量表找出其入口地址,并转去执行该服务程序。 如果采用软件,即利用执行int n指令的方式执行服务程序,则可从系统预留给用户的类型号60H7FH、F1HFFH选择一个。 2、 将服务程序的入口地址置入向量表的相应的四个存储单元 确定了类型号,还要把服务程序入口地址置入向量表,以保证在响应时CPU能自动转入与该类型号相对应的服务程序。下面介绍两种将服务程序入口地址置入向量表的方法。 (1) 直接装入法 用传送指令直接将服务程序首地址置入矢量表。设类型号为60H(此类型号对应的矢量表地址为从00180H开始的四个连续存储单元)。 PUSH DS XOR AX,AX MOV DS,AX ;将数据段寄存器清零 MOV AX,OFFSET INT60 ;将服务程序INT60所在段内的偏移地址送AX MOV DS:[0180H],AX ;将服务程序偏移地址送向量表00180H和00181单元 MOV AX,SEG INT60 ;将服务程序INT60所在段的段地址送AX MOV DS:[0180H+2],AX ;将服务程序所在代码段的段地址送00182H和00183单元 POP DS (2) DOS系统功能调用法 功能号(AH)=25H; 入口参数:(AL)=类型号, (DS)=服务程序入口地址的段地址 (DX)=服务程序入口地址的偏移地址 下面程序段完成类型号为60H的入口地址置入。 PUSH DS ;保护DS MOV DX,OFFSET INT60 ;取服务程序偏移地址 MOV AX,SEG INT60 ;取服务程序段地址 MOV DS,AX MOV AH,25H ;送功能号 MOV AL,60H ;送类型号 INT 21H ;DOS功能调用 POP DS ;恢复DS 3、 使服务程序驻留内存,以便其他应用程序调用 实现这一步骤的必要性在于:一旦服务程序驻留内存后,一般程序员使用这一新增的调用就如同调用DOS或BIOS的程序一样,只要了解其入口要求和返回参数就可调用。程序驻留在内存后,它占用的存储区就不会被其他软件覆盖。使程序驻留内存,要求该程序以 .COM形式运行,这种种结构的程序要求入口定位于100H,并且数据和代码均在同一个段内,这样,.COM程序就被定位于低地址区,DOS常在低地址区增加驻留程序,而 .EXE程序被定位于高地

21,497

社区成员

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

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