ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-10 09:32:53  阅读:230  来源: 互联网

标签:可执行文件 初始化 WORD 指向 装载 堆栈 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有