2024年3月26日发(作者:)

程序段前缀(program segment prefix )

program segment prefix ,简称PSP(程序段的前缀)

当输入一个外部命令或通过EXEC子功能(系统功能调用INF 21h的子功能号为4BH)加

载一子程序时,COMMAND确定当时内存可用空间的最低端作为程序段起点。在程序所占内存

空间的前256个字节中,系统会为程序创建程序的前缀(PSP)的数据区,DOS要利用PSP

来和被加载程序进行通信;PSP内有程序返回、程序文件名等信息,可以通过研究psp定位文

件名信息,进而获取文件名。

从这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为

SA+10H:0 (其中SA为系统为程序分配内存的起始位置的段地址即当前寄存器DS的内容);

(注意:PSP区和程序区虽然物理地址连续,却有不同的段地址。)

该PSP中包含以下三部分信息:

(1)供被加载程序使用的DOS入口,如PSP+0、+2、+5和+2CH字段;

(2)供DOS本身使用的DOS入口,如PSP+0AH、+0EH、+12H和+2CH字段;

(3)供被加载程序使用传递参数,如PSP+5CH,+6CH和80H字段。

PSP结构与CP/M中的“控制区域”是十分相近的。这是因为,DOS本身便是从CP/M演变

而来的。!

程序段前缀PSP格式:PSP结构如下:

偏移量 长度 描述

00H 1 WORD 指令 INT 20H

02H 1 WORD 程序分配块的底部

04H 1 BYTE 保留

05H 5 BYTE CALL功能调用入口

0AH 2 WORD INT 22H结束地址

0EH 2 WORD INT 23H CTRL-BREAK处理程序地址

12H 2 WORD INT 24H 标准错误处理程序地址

16H 1 WORD 父进程PSP

18H 20 BYTE 句柄表

2CH 1 WORD 环境块地址

2EH 2 WORD 保留

32H 1 WORD 句柄表大小

34H 2 WORD 句柄表地址

38H 24 BYTE 保留

50H 1 WORD INT 21H DOS 调用

52H 1 BYTE FAR RET

53H 9 BYTE 保留

5CH 16 BYTE 为未打开的FCB1使用

6CH 20 BYTE 为未打开的FCB2使用

80H 1 BYTE 命令行参数的长度

81H 127 BYTE 命令行参数

( 另外:保存INT 22/INT 23/INT 24H的值使得用户在程序中可修改这些中断的值,病毒就曾利

用这种技术防止不能传染时引起出错信息。在程序退出时根据PSP中保存的值恢复各中断的

值。)

程序段前缀及其应用

程序段前缀PSP(Program Segment Prefix)是一个

具有256个字节的信息区,是可执行文件(EXE和

COM)所特有的,其内容在操作系统装入该文件运行

时存入。

10.8.1 程序段前缀的字段含义

PSP信息区的字段分布如下表10.1所列。

表10.1 PSP信息区的字段分布表

偏移量 内容含义 偏移量 内容含义

00~01H程序结束指令中断20H2E~31H保留

02~03H分配给该程序的最后段的段地址 32~33H文

件句柄表的长度

04~09H保留 34~37H指向文件句柄表的远指针

0A~0DH中断22H的地址(处理终止程序)38~4FH保

0E~11H中断23H的地址(处理^Break)50~51H中断

21H的功能调用