精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>○ DOS>>汇编语言>>关于DOS程序终结

主题:关于DOS程序终结
发信人: sle()
整理人: sle(2000-02-29 18:05:27), 站内信件
关于DOS程序终结
当DOS外部程序运行结束时,必须将控制转移至其父进程,这一过程称为程序终结
。但对程序终结,Microsoft没有公开具体细节,而是提供了几个关于程序终结的
中断和功能调用。
    一、有关中断
        1、INT 20H
        功能:程序退出,恢复终结地址,CTRL-BREAK地址,以及出错退出地址
。用户必须自己关闭所有文件以释放文件缓冲区。程序必须保证CS指向文件段前
缀。
        2、INT 21H
        在INT 21H中提供了若干个功能调用:
        (1)AH=0 CS=PSP
        与INT 20H功能相似。
(2)AH=31H  AL返回码 DX驻留内存的段落数。
        返回码可被父程序用4D功能检测,或批命令ERRORLEVEL检测,不关闭所
有文件也不释放任何内存。
        (3)AH=4CH  AL 返回码
        关闭所有文件,释放所有内存。(一般常规程序的退出方法)
        3、关于INT 22H、INT 23H、INT 24H
        INT 22H中断向量在DOS中称之为程序终结地址,在程序中不能直接调用
该中断,在DOS技术手册中,指出程序终结时控制转移至这个中断的地址。在程序
段产生时这个地址就复制到程序段前缀中。功能调用EXEC完成这些操作。Micros
oft没有更具体地说明。
        INT 22H、INT 23H、INT 24H在程序终结时可自动从PSP中恢复。
        4、INT 27H
        入口:DX=驻留内存长度(字节)
        除了长度<64KB(.com文件)外,与功能31H相似。
二、讨论
程序的终结,实质上就是进程的终结。当将控制转移至你程序之前,系统要释放
进程所占资源,包括文件资源和内存资源,恢复父进程的运行环境,再将控制转
移到父程序处。程序终结涉及PSP,MCB等DOS内部结构的管理。
在执行EXEC功能之前,首先要为待执行程序分配内存,在执行EXEC功能时,首先
为进程建立PSP,保存INT23H、INT 24H中断向量于PSP+0EH处,从栈中取得父进程
的返回地址,填入PSP+0AH处,这里就是程序终结时返回父进程的地址。设置PSP
为当前PSP,初始化寄存器并将控制交给子进程。当子进程终结时,应该关闭其所
有文件,释放其所占用的内存资源,恢复INT 22H、INT 23H、INT 24H中断向量,
将PSP设为父进程。
综上所述,我们可以不通过DOS中断或功能调用,直接在程序中返回父程序。采用
这种方法可以灵活地管理内存资源、文件资源以及完成用户自己INT 23H、INT 2
4H、TSR程序的安装。
三、示例
下面这段程序大家可在debug下健入。
C:\>debug
-A100
MOV AH,51H
INT 21H ;取当前PSP
DEC BX
MOV DS,BX;DS指向当前程之起始MCB
MOV AX,0
MOV [1],AX;释放所占内存
MOV BX,[3CH]
DEC BX
MOV ES,BX
MOV ES[1],AX;释放环境块
MOV AX,0
MOV ES,AX
MOV DI,88H
MOV SI,1AH
MOV CX,0CH
CLD
ERP MOVSB;恢复INT 22H、INT 23H、INT 24H
MOV BX,[26h];取父进程PSP
MOV AX,5000H
INT 21H;设置为当前PSP
MOV ES,BX
MOV AX,ES[30H]
CLI
MOV SP,ES[2EH]
MOV SS,AX;设置父进程的堆栈指针
STI
JMP FAR[1AH];转移到父进程
-NEXIT1.COM
-RCX
:50
-W100
-G=100;也可在命令行方式下打入EXIT1.
该程序可终结当前进程,释放内存资源,返回父进程,注意程序没有对文件句柄进行
处理.


李君

--
sigh,,曾经有一盆清蒸的甲鱼摆在我的面前,可是我却没有珍惜, 
等到它被人瓜分的时候才追悔莫及,人世间最痛苦的事莫过于此。 
如果上天能够给我一个再来一次的机会,我会对它说:“我吃你” 
如果要给这份遗憾加上一个期限,我愿是---一分钟。   

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.106.220.106]

[关闭][返回]