第一章 001DOS可执行程序结构剖析.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DOS可执行程序结构剖析   在MS—DOS中,有两种类型的可执行程序,即.COM程序和.EXE程序。8086/8088汇编语言也有相应两种程序结构的文件,可分别编译最终形成.COM程序和.EXE程序。而汇编语言又是计算机能提供给用户的最快而又最有效的语言,因而在对于程序的空间和时间要求很高的场合,汇编语言是必不可少的,所以从根本上阐明.EXE文件和.COM文件的程序结构特点,以及它们之间的区别,两种程序的不同加载情形和程序段前缀结构特征,是真正领会汇编语言编程的必要条件。 1 码段的基本组成   对于1个汇编语言小程序,可以不定义数据段、附加段和堆栈段,但不能不定义代码段,没有码段则不成为程序,所以首先来认识一下码段的基本组成。 1.1 8086/8088汇编语言程序的.EXE文件(“标准序”)结构形式如图1 图1 .EXE文件的结构 1.1.1 为了正确汇编,汇编程序在汇编时必须清楚程序中段的结构以及各种指令在执行时应该访问哪一个段?即程序中段和段寄存器的关系,这可由ASSUME伪操作来实现。   格式为:ASSUME 段寄存器1:段名1,段寄存器2:段名2,…   如:ASSUME CS:CODE,DS:DATA,SS:STACK   这实际上就是说,码段CODE的段地址值放在CS段寄存器中,数据段DATA的段地址值放在DS段寄存器中,堆栈段STACK的段地址值放在SS段寄存器中。 1.1.2 ASSUME仅仅是指明段寄存器与段的关系,并未保存段地址,所以如有数据段、附加段、堆栈段,则必须保存段地址。码段不需保存段地址,因为码段的这一操作是在程序初始化时完成。   格式为: MOV  AX,段名        MOV段寄存器,AX        MOVAX,DATA 如:     MOVDS,AX 1.1.3 汇编语言程序是DOS的一个子程序,所以要把汇编语言程序的主体部分定义成一个远过程,以便由DOS调用该过程,在程序结束时用RET指令返回DOS。   格式为:  过程名 PROC FAR            .            .            .           RET        过程名 ENDP 1.1.4 为了在程序结束时用RET指令能正确返回DOS,在码段的开始处,必须保存DOS现场即保存返回地址,保存返回地址的指令为:     PUSH  DS     SUBAX,AX     PUSHAX 1.2 8086/8088汇编语言程序的.COM文件结构形式   如图2   使用.COM文件时,程序不分段,其入口点必须是0100H,也不必设置堆栈段,且对所有的过程均应定义为NEAR属性。 ? 图2 .COM文件的结构 2 程序的加载   程序的加载是指将.EXE文件或.COM文件装入内存并执行之,加载1个程序是由DOS的4BH号系统功能来完成的。程序装入内存时,DOS还在它的前面安装1个256(100H)字节长的程序段前缀(Program Segment Prefix),作为DOS与运行程序的软件接口。 2.1 程序段前缀(PSP)   程序段前缀(PSP)简言之就是1个数据结构,它和用户程序本身位于同一内存分配块中,构成一个不可分割的整体。它是DOS(作为加载程序的父程)和被加载程序的软件接口。它主要是用来存放与用户程序有关的一些控制信息,并提供程序正常或异常结束时返回DOS的途径。它总共有256个字节长,位于程序所在段的起始位置。PSP的DOS结构如图3所示: 图3 程序段前缀结构 2.2 .COM文件的内存映象   一个.COM程序存储在磁盘中的内容同执行时装进内存的内容完全一致。执行时只是简单地将.COM程序拷贝到程序段前缀的紧上端,起始地址为100H,.COM文件装入内存后的映象如图4所示: 图4 .COM文件的内存映象 由此内存映象图可看出:   (1)当1个.COM程序开始执行时,所有的段寄存器(CS,DS,SS和ES)都含有相同的值,都是程序段前缀(PSP)所在段的段地址。即4个段实际上是同一物理段,段的最大长度为64KB,这也是.COM文件长度的最大限度。   (2).COM程序是从偏移地址值为100H处开始执行的。DOS强行设置IP=0100H,即初始的CS:IP规定指向PSP之后的第1个字节位置。于是在编写.COM文件源程序时,在用ORG 100H伪指令预留PSP空间后,其后的第1条指令应该是1条可执行的指令。   (3)整个.COM程序必须在1个物理段(64KB)内,段尾处的1个字作为堆栈使用。在将控制权移交给.COM程序前,MS-DOS总要将1个字0压进堆栈。减去这个字和程序段前缀占用的256个字节空间,余下的空间便是.COM程序可以使用的空间。也就是说,.CO

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档