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