新浪博客

PSP(程序段前缀)的意义(一)

2018-12-07 21:31阅读:
提要:本文介绍在 DOS 管理之下应用程序的启动与退出到 DOS。


大家都知道,在磁盘操作系统 DOS 之下运行的应用程序有两种类型:*.EXE、*.COM。


在 DOS 命令行键入程序名,再回车,即可执行该应用程序。


但是,应用程序是怎样从 DOS 接过计算机的控制权,运行完毕再把控制权交还给 DOS,这个过程的细节,恐怕就没有多少人知道了。


下面,做而论道就简单介绍这些过程。


两者的交接,需要用到程序段前缀 (Program Segment Prefix、PSP)。


一、在 DOS 管理之下运行应用程序,DOS 交出控制权的步骤


(1) 建立 PSP


DOS 先在存储器中为应用程序建立一个 PSP。


PSP 位于存储器的最低可用地址,占用 256(100H) 字节,其内容到后面再说。


(2) 载入代码


DOS 然后从磁盘上读入应用程序各个段的代码,顺序存放在 PSP 之后的存储区域。


(3) 寄存器赋值


在应用程序开始运行之前,DOS 预先对四个段寄存器赋值。


(i) EXE 程序
DS、ES 的值就是 PSP 所在的段地址。


SS 的值是程序中第一个段的段地址。
因为 PSP 占 100H 字节,所以 SS 的值要比 DS、ES 大 10H。


CS 的值是程序中首先要执行的代码段的段地址。
当程序中的第一个段就是要执行的代码段,CS 就和 SS 的值相同。
IP 的值为 0000H。


(ii) COM 程序
COM 程序仅仅使用一个段,即数据、代码和堆栈,都位于同一个段,共用 65536 字节。
因此,DS、ES、SS 和 CS,都是同一个值,即最低可用地址的段地址。


PSP 也在这 64K 字节之内,在其后存放程序的数据和程序代码。
那么,程序起始的偏移地址就是 0100H,所以 IP 的值为 0100H。


(4) 运行应用程序


CS 和 IP 确定之后,CPU 立即从它们指定的地址去取指令代码。
这样,应用程序即接手对计算机进行控制。


二、应用程序结束运行,将控制权交还给 DOS


在应用程序结束时,执行 INT 20H (机器码是 CD 20) 即可结束该程序,并返回 DOS。


(1) 利用 PSP 结束程序


由于 PSP 头两个字节的内容就是 CD 20,所以有一些人如下编程:


START: ;程序开始
PUSH DS ;在堆栈中压入 PSP 的段地址
MOV AX, 0
PUSH AX ;在堆栈中压入 0000
......
...... ;应用程序代码
......


EXIT: ;程序结束
RET ;返回到 DS:0000,去执行 INT 20H


其中,START 所在的段,应该预先定义为 FAR。这样 RET 指令才能将两个字弹出到 CS 和 IP。
这种方法,是最麻烦的。


(2) 利用 INT 21H 结束程序


程序如下:


EXIT:
MOV AX, 4C00H
INT 21H


其中 AL=0 是返回给 DOS 的错误信息,不过没有什么用。


(3) 利用 INT 20H 结束程序


这种方法最简单实用了。
在程序中写上 INT 20H,执行到此处,即可结束程序。


如果是 COM 程序,使用这种方法,还是可以的。
因为 COM 程序的各个段,都是处于同一个 64K 段之内,PSP 也是在这里面。
使用 INT 20H,就可以把各个段、PSP 所占用的存储区,都交还给操作系统 DOS。


但是,对于 EXE 程序,使用这种方法只是从当前段退出到 DOS。
当前段之前的、以及 PSP 所在的段,就被遗留在内存里面了。


说明:
做而论道,是本博主在百度开博时用的网名。但是,这个昵称,在新浪这里,不让用。
只能另外起名为:黄渤之间,以纪念行走多年的地方。

我的更多文章

下载客户端阅读体验更佳

APP专享