其他分享
首页 > 其他分享> > DOS实模式下可执行文件的基本结构及相应的装载过程

DOS实模式下可执行文件的基本结构及相应的装载过程

作者:互联网

DOS实模式下可执行文件的基本结构及相应的装载过程。

实模式下的可执行程序,分为两种:

(1).com的可执行程序

   特征:A. 代码段、数据段、堆栈段三合一;
        B. 整个程序就只有一个段(段长也就是程序长度不能超过64KB);
        C. 程序的起始地址(执行的第一条指令)就在偏移100H处。
        一般用org 100h伪指令来指定第一条指令存储的偏移地址

(2).exe的可执行程序

   特征:可以有多个代码段或者多个数据段,也可以设置多个堆栈段。

DOS实模式下的可执行程序(.com的或者.exe的) 在加载时都会先建立一个程序段前缀:

PSP(Program Segment Prefix,长度为100H) 的数据结构用于该程序和DOS操作系统进行通信。该PSP的结构如下:

特别说明:

1、.com程序加载后,CS,DS,SS,ES均指向PSP的段地址(整个.com程序只有一个段,第一条指令的偏移地址固定为100H)

2、.exe程序加载后,DS和ES并没有指向全局数据段,而是指向PSP的段地址,加载时自动初始化CS指向代码段,SS指向堆栈段。

​ 所以,一般来说,在汇编程序中必须初始化DS和ES,让它真正指向咋们自己的数据段或附加数据段。如下类似代码:

 mov ax, data        ;让DS指向数据段  数据段的段名就是数据段的段地址(常量)
 mov ds, ax 
 
  mov ax, data        ;让ES指向附加数据段
  mov es, ax 
 

DOS下EXE可执行程序的基本结构(在磁盘上的外存映像):

DOS头的结构:(用语言)

typedef struct _IMAGE_DOS_HEADER {                 // DOS .EXE header
   +0h WORD   e_magic;                          // *****DOS可执行文件标记*****
   +2h WORD   e_cblp;                      // Bytes on last page of file
   +4h WORD   e_cp;                        // Pages in file
   +6h WORD   e_crlc;                      // Relocations
   +8h WORD   e_cparhdr;                   // Size of header in paragraphs
  +0ah WORD   e_minalloc;                  // Minimum extra paragraphs needed
  +0ch WORD   e_maxalloc;                  // Maximum extra paragraphs needed
  +0eh WORD   e_ss;                        // DOS代码的初始化堆栈SS
  +10h WORD   e_sp;                        // DOS代码初始化堆栈指针SP
  +12h WORD   e_csum;                      // Checksum
  +14h WORD   e_ip;                        // DOS代码初始化指令入口[指针IP]
  +16h WORD   e_cs;                        // DOS代码的初始化堆栈入口
  +18h WORD   e_lfarlc;                    // File address of relocation table
  +1ah WORD   e_ovno;                                             // Overlay number
  +1ch WORD   e_res[4];                    // Reserved words
  +24h WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
  +26h WORD   e_oeminfo;                   // OEM information; e_oemid specific
  +29h WORD   e_res2[10];                  // Reserved words
  +3ch LONG   e_lfanew;                    // *****指向PE文件头*****  此项在DOS下的EXE文件中没有
  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

标签:可执行文件,初始化,WORD,指向,装载,堆栈,DOS,可执行程序
来源: https://www.cnblogs.com/Mr-black-7/p/16252149.html