i社区用户: 密码:
搜索:
首页| 资讯| 信息化| 产品| 专题| 创业| 技术天地| 企业中心| 企业论坛| 职场| 周报全文| 商城| 市场
会展| Blog| i社区| 社区联盟| RSS| 电子杂志| 发行| 直播| IT两会| i| 下载| 上网导航| CIO俱乐部

多路中断INT2FH的分析与应用

宋立波

DOS系统的INT2FH是未见文档的中断调用功能,被称为多路复用
中断。系统在执行内部命令和外部命令时首先要调用该中断,判断该命令是内
部命令还是外部命令即应用程序。如果是内部命令则利用DOS系统内核功能
执行之;如果是外部命令则查找其所在目录,然后利用DOS内核功能加载并
执行之。笔者通过对该中断进行跟踪分析,总结出DOS系统中多路复用中断
INT2FH在命令执行过程中的具体工作原理及其调用格式,并根据该原理
结合程序实例总结出INT2FH在扩充DOS内部功能过程中的使用技巧。
一、INT2FH具体工作原理
DOS系统的多路复用中断INT2FH在命令的执行过程中起到了举足
轻重的作用,具体原理阐述如下:
内部命令的执行过程
1、DOS系统利用INT21H的0AH号子功能在命令行循环等待接
受命令输入,一旦命令输入后立即通知DOS系统的多路复用中断INT2F
H。
2、该中断首先调用其子功能AE00H子功能调用判断该命令是否为D
OS的内部命令。如果是在AL寄存器中返回OOH,并自动调用子功能11
23H利用中断INT21H各个子功能完成文件的查找、打开、拷贝和删除
等操作。在此过程中如果遇到非法中断内部命令的执行的其它操作(CTRL
-C等),则立即中止当前中断调用功能,转到INT2FH的1120H进
行命令中断处理,并转步骤“4”中继续进行其它任务处理工作。
3、其次调用INT2FH的子功能1122H进行命令结束时的善后处
理工作。
4、最后依次调用INT2FH的111DH、1125H进行当前驱动
器和当前目录的设置工作,并完成系统命令行提示状态,进行步骤“1”,调
用INT21H的0AH号子功能等待输入命令。
外部命令的加载执行过程
1、DOS系统利用INT21H和0AH号子功能在命令行循环等待接
受命令输入,一旦命令输入后立即通知DOS系统的多路复用中断INT2F
H。
2、当DOS系统接受命令行命令后利用INT2FH的AE00H子功
能调用,判断该命令是否为DOS的外部命令。如果是则自动调用INT2F
H子功能1123H,根据PATH命令设置的路径利用中断INT21H的
子功能查找该应用程序。找到该程序之后进行如下工作:如果程序名后跟有命
令行参数,则将DOS暂驻区的原始命令行参数内容转换成标准格式化参数形
式传送到程序的格式化参数区PSP:005CH和PSP:006CH处,
并将未经转换的原来命令行参数直接送到非格式化参数区PSP:0080H
处;如果程序名后未跟命令行参数,则将格式化参数区填充以字符20H,并
将程序名传送到非格式化参数区中。
3、然后利用中断调用INT21H的子功能4B00H完成程序的加载
和执行任务,在此过程中如果遇到非法中断内部命令的执行的其它操作(CT
RL-C等),则立即中止当前中断调用功能,转到INT2FH的1120
H进行命令中断处理工作,之后转入步骤“5”中继续进行其它任务处理工作。
4、其次,在程序执行完后调用INT2FH的子功能调用1122H进
行程序结束处理,并利用多路复用中断子功能1123H重新加载COMMA
ND的第二副本(暂驻区)到内存高端。
5、最后依次调用INT2FH的111DH、1125H进行当前驱动
器和当前目录的设置工作,并完成系统命令行提示状态,进行步骤“1”,调
用INT21H的0AH号子功能等待输入命令。
特殊程序APPEND.EXE的工作过程
APPEND.EXE是DOS 3.3以后增加的外部命令,该外部命
令与内部命令PATH相对应,APPEND是设置应用程序查找数据或任意
文件的路径外部命令,而PATH只是设置系统查找应用程序路径的内部命令
。通过对APPEND程序的跟踪分析,发现其工作过程如下:
1、DOS系统利用INT21H的0AH号子功能在命令行循环等待接
受命令输入,一旦命令输入后立即通知DOS系统的多路复用中断INT2F
H。
2、当接到的命令是APPEND.EXE程序时,如果是首次加载执行
该程序,则与执行其它外部命令的过程基本相同,并将APPEND.EXE
程序驻留于内存中形成非弹出式TSR程序,并接管INT2FH的子功能A
E00H和AE01H。
3、如果是再次执行该程序时,DOS系统首先自动调用INT2FH的
AE00H子功能,利用APPEND程序扩充该子功能部分,调用INT2
FH的B700H子功能判断APPEND命令是否安装,如果已经安装则在
出口寄存器ALH中设置出口参数FFH。
4、根据出口参数,系统自动调用INT2FH的子功能AE01H,A
PPEND扩充的AE01H子功能部分根据命令行具体参数的内容完成相应
的任务:如果命令行带有参数,则扩充的子功能AE01H自动完成数据文件
路径的重新设置工作并继续进行下一步骤;如果命令行不带任何参数则自动调
用APPEND扩充的多路复用中断子功能B700H、B702H和B70
4H进行已经设置的路径和版本等信息的查找与显示。
表一:INT2FH 子功能调用格式
----------------------------------
子功能 入口参数 出口参数
----------------------------------
AX=AE00H AL=00H 表示一般
DX=FFFFH DOS命令
DS:BX或ES:BX指向 并且自动调用1123H子功
AE00H 初始命令行暂驻区 能执行之
DS:SI或ES:SI指向 AL=FFH表示扩充DOS
大写命令暂驻区 内部命令
并且自动调用AE01H
----------------------------------
AX=AE01H
DX=FFFFH
DS:BX或ES:BX指向 DS:SI指向大写命令行暂
AE01H 初始命令行暂驻区 驻区及其命令参数计数单元
子功能执行任务
DS:SI或ES:SI指向
大写命令暂驻区
----------------------------------
AX=1123H
DS:BX或DS:DX外部
命令路径地址指针 DS:BX找到或加载执行程
1123H ES:DI指向查找命令的 序的字符串地址指针
路径地址指针
----------------------------------
AX=1125H
1125H ES:SI指向当前路 无
径名地址指针
----------------------------------
AX=111DH
111DH DS:BX指向当前驱 无
动器符地址指针
----------------------------------
1122H AX=1122H 无
----------------------------------
1120H AX=1120H 无
----------------------------------
表二:APPEND程序扩充子功能调用格式
----------------------------------
子功能号 入口参数 出口参数
----------------------------------
B700H AX=B700H AL=00H 表示APPEND命令
未安装
INT2FH AL=FFH 表示APPEND命令
已经安装
----------------------------------
B702H AX=B702H AL=DOS主版本号
INT2FH AL=DOS次版本号
----------------------------------
B704H AX=B704H ES:DI指向APPEND命令设置
的路径
----------------------------------
工作;
5、最后调用INT2FH的子功能1125H完成系统命令行提示状态
,进入步骤“1”,调用INT21H的0AH号子功能等待输入命令。
二、INT2FH的中断调用格式
以上对INT2FH的工作原理进行具体分析,要充分开发利用该中断的
具体功能,还要了解其中断调用的具体格式,本文给出了该中断的所有子功能
的入口参数及出口参数的格式,见表一。
三、扩充DOS内部功能实现机制
通过上述剖析DOS系统多路复用中断INT2FH的工作原理及其调用
格式,不但了解到DOS内部、外部命令加载执行过程及其在DOS系统中的
作用,还可以发现DOS系统中提供了扩充类似内部命令的接口子功能AE0
0H和AE01H。该两个接口子功能在命令输入后由DOS系统自动调用执
行,我们只是重新编制这两个调用接口功能模块,将自己的应用程序设计成类
似APPEND.EXE的非弹出式内存TSR程序,将其驻留内存之后就可
以像DOS的内部命令一样,不受系统当前驱动器和路径制约,对于常用实用
程序来说这有利于提高程序的执行速度,增强程序使用的方便性。
这里需要指出的是INT2FH的子功能AE00H的入口参数DS:B
X指向的原始命令行暂驻区与程序段前缀PSP:0080H处的非格式化参
数区略有不同,DS:BX参数处的格式如下:
DSN...PPPPPPPP......
1、其中首字节“D”代表当前驱动器符,如80H代表当前驱动器、8
1H代表当前驱动器为A、82H代表当前驱动器为B、83H代表当前驱动
器为C等等。
2、第二个字节“S”代表命令行参数的总计数值,其中不包括回车符0
DH。
3、第三个字节开始处“N”代表参数中的命令名部分。
4、其后的字节“P”代表命令名后的其它命令行参数。
该参数区与PSP:0080H处的长度均为128个字节,所不同的是
:PSP:0080H处没有当前所在驱动器说明部分“D”;当程序名后跟
有命令行参数时没有程序名部分“N”,而多路复用中断中DS:BX参数暂
驻区部分则是命令行参数最完整最原始的形式。
四、程序实例
文后所附程序REND.ASM就是通过接管上述INT2FH的AE0
0H和AE01H两上接口功能,在AE00H子功能模块中判断命令REN
D是否已经驻留内存。驻留则在AL中返回FFH,实现自动调用子功能AE
01H;在AE01H子功能根据特定标志单元和DX:BX参数暂驻区取得
的参数,利用DOS系统的中断调用INT21H的11H、12H和17H
子功能,实现任意驱动器、任意路径下的具有任何属性的子目录的改名任务。
该实用程序只要经汇编连接生成COM文件后运行一次驻留内存,这时我们就
可以像使用DOS的内部命令REN一样完成修改子目录名功能,而不必考虑
当前所在的驱动器和程序所在的路径等因素,而且命令执行的速度要比一般外
部命令速率高。
本文不仅提供了一个实用程序,更重要的是提供了扩充DOS内部功能的
实现机制。
程序清单附后:
;REND.ASM
CODE SEGMENT`CODE`
ORG 100H
ASSUME CS:CODE,DS:CODE
START: JMP BEGIN
BUFF DB 0FFH,0,0,0,0,0,17H;文件控制块
BUFFA DB 12 DUP(20H);第一个目录名
DB 5 DUP(?)
BUFFB DB 11 DUP(20H);第二个目录名
DB 8 DUP (?)
MYBUFF DB 64 DUP (?)
SCREENO DB `FAIL FOR SUBDIRECTORY SCAN!`,24H
SCREEN1 DB `RENDIR PARAMENTER NOT!`,24H
SCREEN2 DB `RENDIR UNVARABLE PARAMENTER!`,24H
OLD2FH DD 0000H
NAMFLAG DB 00H
PARAFLAG DB 00H
NEW2FH PROC FAR
STI
CMP AX,OAE00H
JE EQUAL1
CMP AX,OAE01H
JE EQUAL2
JMP SHORT EXIT2FH
EQUAL1: CMP DX,OFFFFH ;AE00H子功能扩充部分
JNE EXIT2FH
PUSH SI
PUSH BX
MOV SI,BX
INC SI
INC SI
CALL CMPNAME
POP BX
POP SI
JNZ EXIT2FH
MOV CS:NAMFLAG,01H
MOV AL,OFFH
IRET
EXIT2FH: JMP CS:0LD2FH
EQUAL2: CMP DX,0FFFFH ;AE01H子功能扩充部分
JNZ EXIT2FH
CMP CS:NAMFLAG,01H
JNE EXIT2FH
MOV CS:NAMFLAG,00H
PUSH DS
PUSH ES
PUSH DI
PUSH SI
PUSH DX
PUSH BX
PUSH CS
POP ES
LEA DI,CS:BUFFA ;取第一个目录名
MOV SI,BX
INC SI
CMP BYTE PTR [SI],09H
JB EXIT1
MOV AL,[SI-01H]
SUB AL,80H
STOSB
ADD SI,05H
MOV CS:PARAFLAG[0],00H
CALL NAMEMOV
JC EXIT1
PUSH DS
PUSH SI
PUSH CS
POP DS
MOV DX,OFFSET MYBUFF
MOV AH,1AH
INT 21H
MOV DX,0FFSET BUFF
MOV AH,11H ;查找及取文件属性过程
INT 21H
OR AL,AL
JNZ EXIT2
ATTRIB: MOV BX,0FFSET MYBUFF
MOV SI,0FFSET BUFF
MOV AL,[BX]
CMP AL,0FFH
JNZ NEXT
MOV AL,[BX+6]
MOV [SI+6],AL
JMP RENAME
NEXT: MOV DX,0FFSET BUFF
MOV AH,12H
INT 21H
OR AL,AL
JNZ EXIT2
JMP ATTRIB
RENAME: POP SI ;取第二个目录名
POP DS
LEA DI,CS:BUFFB
MOV CS:PARAFLAG[0],01H
CALL NAMEMOV
JC EXIT1
PUSH CS
POP DS
MOV DX,0FFSET BUFF
MOV AH,17H ;改目录名操作
INT 21H
CMP AL,00H
JZ EXITNEW
MOV DX,0FFSET SCREEN2
JMP EXIT
EXIT2: POP SI
POP DS
MOV DX,0FFSET SCREEN0
JMP EXIT
EXIT1: MOV DX,0FFSET SCREEN1
EXIT: PUSH CS
POP DS
MOV AH,09H
INT 21H
EXITNEW: POP BX
POP DX
POP SI
POP DI
POP ES
POP DS
MOV BYTE PTR DS:[SI],00H
IRET
NEW2FH: ENDP
NAMEMOV PROC NEAR ;取目录名子程序
NEXT1: LODSB
CMP AL,20H
JNE NEXT2
JMP SHORT NEXT1
NEXT2: CMP AL,0DH
JE EXITMOV
MOV CX,000BH
NEXT3: CMP AL,61H
JB NEXT31
CMP AL,7AH
JA NEXT31
AND AL,0DFH
NEXT31: STOSB
NEXT4: LODSB
CMP AL,20H
JE NEXT5
CMP AL,0DH
JE NEXT6
CMP AL,2EH
JE NEXT4
LOOP NEXT3
LODSB
CMP AL,20H
JNE EXITMOV
RETURN: CLC
RET
NEXT5: JCXZ RETURN
MOV AL,20H
STOSB
LOOP NEXT5
JMP RETURN
NEXT6: JCXZ NEXT7
MOV AL,20H
STOSB
LOOP NEXT6
NEXT7: CMP CS:PARAFLAG[0],01H
JE RETURN
EXITMOV: STC
RET
NAMEMOV ENDP
CMPNAME PROC NEAR ;命令名比较子程序
PUSH CX
PUSH AX
LODSB
AND AL,0DFH
CMP AL,`R`
JNZ EXITCMP
LODSB
AND AL,ODFH
CMP AL,`E`
JNZ EXITCMP
LODSB
AND AL,0DFH
CMP AL,`N`
JNZ EXITCMP
LODSB
AND AL,0DFH
CMP AL,`D`
JNZ EXITCMP
LODSB
CMP AL,0DH
JE EXITCMP
CMP AL,20H
EXITCMP: POP AX
POP CX
RET
CMPNAME ENDP
BEGIN: PUSH CS
POP DS
MOV AX,352FH
INT 21H
MOV WORD PTR 0LD2FH,BX
MOV WORD PTR 0LD2FH+2,ES
MOV DX,0FFSET NEW2FH
MOV AX,252FH
INT 21H
MOV DX,0FFSET INSTALL
MOV AH,09H
INT 21H
MOV DX,0FFSET BEGIN
ADD DX,000FH
MOV CL,04H
SHR DX,CL
MOV AX,3100H
INT 21H
INSTALL DB` BE INSTALLED!`,24H
CODE ENDS
END START

(计算机世界报 1994年 第20期)



周报全文频道联系方式:010-68130909
【关于我们】  【广告服务】  【周报发行】  【投稿指南】  【投稿声明】  【联系方式】  【法律声明】
  【媒体手册】  【编读往来】  
Copyright© ccw.com.cn,All rights reserved
中国计算机世界出版服务公司版权所有