0xAA55 发表于 2014-1-27 20:38:42

DOS程序PSP头的结构

PSP头是DOS的16位程序都要用到的数据块,总共占用256字节,作用是帮助程序访问基本的DOS功能。
COM程序的org 256(org 0x100、org 100h)之所以设置其实前面的保留块


从www.ctyme.com拿下来直译过来的,不保证大家能看懂

偏移  长度      描述
0x00  2    BYTEs  INT 0x20指令
0x02  2    WORD  分配给程序的第一个段
0x04  1    BYTE  DOS:未使用,OS/2:假的DOS版本返回数
0x05  1    BYTE  CP/M:CALL 5服务请求(远调用到绝对地址0x00C0)
0x06  2    WORD  CP/M:兼容性--.COM文件第一个段的大小
0x08  2    BYTEs  剩下的远跳转到0x05
0x0A  4    DWORD  存储的INT 0x22终止地址
0x0E  4    DWORD  存储的INT 0x23控制中断处理地址
0x12  4    DWORD  DOS 1.1+:存储的INT 24关键性异常处理地址
0x16  2    WORD  父PSP段
0x18  20   BYTEs  DOS 2+:正在操作的文件表,每个文件句柄占1字节, FFh = 已关闭
0x2C  2    WORD  DOS 2+:环境变量的段
0x2E  4    DWORD  DOS 2+:最后的INT 21调用后的程序的SS:SP
0x32  2    WORD  DOS 3+:正在操作的文件表项数(默认20)
0x34  4    DWORD  DOS 3+:正在操作的文件表的地址(默认PSP:0018h)
0x38  4    DWORD  DOS 3+:上一个PSP的指针(默认FFFFFFFFh在3.x版本的DOS)用于DOS 3.3的SHARE
0x3C  1    BYTE  DOS 4+:(DBCS)中期控制台标识(见AX=6301h)Novell DOS 7 DBCS中期标识在AX=6301h这里设置(可能同样被Far East MS-DOS 3.2-3.3使用)
0x3D  1    BYTE  (APPEND)TrueName标识(see INT 0x2F/AX=0xB711)
0x3F  1    BYTE  (Novell NetWare) Novell 任务数,如果上个字节是CEh
0x40  2    BYTEs  DOS 5+ INT 21/AH=30h返回的版本号
0x42  2    WORD  (MSWindows3)链表中的下一个PSP (PDB)的选择子。Windows有一个链表,只用于Windows程序
0x44  2    WORD  (MSWindows3) "PDB_Partition"
0x46  2    WORD  (MSWindows3) "PDB_NextPDB"
0x48  1    BYTE  (MSWindows3) 如果位0设置了,那么这不是一个Windows应用程序(WINOLDAP)
0x49  1    BYTE  对于DOS版本<= 6.00的,未使用
0x4C  2    WORD  (MSWindows3) "PDB_EntryStack"
0x4E  2    BYTEs  对于DOS版本<= 6.00的,未使用
0x50  3    BYTEs  DOS 2+ 服务请求(INT 21/RETF指令)
0x53  2    BYTEs  对于DOS版本<= 6.00的,未使用
0x55  7    BYTEs  对于DOS版本<= 6.00的,未使用;能用于制作第一个FCB到扩展的FCB
0x5C  16   BYTEs  第一个默认的FCB,从第一个命令行参数填充覆盖第二个FCB,如果打开了文件。
0x6C  16   BYTEs  第二个默认的FCB,从第二个命令行参数填充覆盖开始的命令行,如果打开了文件。
0x7C  4    BYTEs  未使用
0x80  128   BYTEs  命令行或默认的DTA命令尾是BYTE用于尾巴的长度, N BYTEs用于尾巴,在包含了0Dh字节的后面
页: [1]
查看完整版本: DOS程序PSP头的结构