使汇编程序返回DOS的方法

Author: 王 侃 Date: 1993-09-24

        DOS在加载用户程序时,首先在内存低端建立程序段前缀(PSP),并在PSP+0处存放int 20H的程序终止处理向量,然后执行一系列其它操作,最后步骤是初始化段和指针寄存器,将SP置成被装入模块入口时的SP,将SS置成被装入模块中堆栈段的相对段值,DS,ES均置成PSP+0字段地址,并产生CS,IP,最后转向被加载程序。为返回DOS,在被加载程序最后,应转去调用int 20H中断,将控制转向PSP+0。因此,若程序开始时,将DS(或ES)、0000H进栈保护,则在程序结束时通过执行FARRET,即可达到目的。所以在汇编语言的示范程序中常可见到
        PUSH  DS
        MOV  AX,0
        PUSH  AX
        等语句在代码段的开始处。以上是对生成EXE文件的汇编程序而言。对于生成COM文件的汇编程序而言,由于DOS加载程序时,将DS,ES,CS,SS均指向PSP+0字段,栈顶字含有0000H,且COM文件和长度不超过64K,因此CS在程序执行时始终指向PSP+0处,所以只要用户在程序结束时执行NEARRET就可调用int 20H中断返回DOS。
        以上是常见的用int 20H中断返回DOS的方法,也可使用int 21H的00H,31H,4CH等中断返回DOS”。(王侃)