发信人: 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]
  | 
 
 
 |