程序段的前缀

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

  当输入一个外部命令或通过EXEC子功能(系统功能调用INF 21h的子功能号为4BH)加载一子程序时,COMMAND确定当时内存可用空间的最低端作为程序段起点。在程序所占内存空间的前256个字节中,系统会为程序创建程序的前缀(PSP)的数据区,DOS要利用PSP来和被加载程序进行通信;PSP内有程序返回、程序文件名等信息,可以通过研究psp定位文件名信息,进而获取文件名。

  从这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为SA+10H:0 (其中SA为系统为程序分配内存的起始位置的段地址即当前寄存器DS的内容);

 

偏移 字节数 说 明
0000 02 中断20H
0002 02 以节计算的内存大小(利用这个可看出是否感染引导型病毒)
0004 01 保留
0005 05 至DOS的长调用
000A 02 INT 22H 入口 IP
000C 02 INT 22H 入口 CS
000E 02 INT 23H 入口 IP
0010 02 INT 23H 入口 CS
0012 02 INT 24H 入口 IP
0014 02 INT 24H 入口 CS
0016 02 父进程的PSP段值(可测知是否被跟踪)
0018 14 存放20个SOFT号
002C 02 环境块段地址(从中可获知执行的程序名)
002E 04 存放用户栈地址指针
0032 1E 保留
0050 03 DOS调用 ( INT 21H / RETF )
0053 02 保留
0055 07 扩展的FCB头
005C 10 格式化的FCB1
006C 10 格式化的FCB2
007C 04 保留
0080 80 命令行参数长度(不包含总为最后的0D)及参数
也是程序运行期间缺省的DTA

这在.com文件中最能体现

 

code segment
   org 100h
   assume cs:code,ds:code
main proc near
          jmp start
a        dw 123
b        dw 456
sum   dw ?
start: mov ax,a
          add ax,b
          mov sum,ax
          ret
main endp
code ends
          end main

 

org  100h  就表示有程序段前缀

 

posted on 2009-10-31 19:35  java课程设计  阅读(378)  评论(0)    收藏  举报

导航