返回DOS的方法课件_第1页
返回DOS的方法课件_第2页
返回DOS的方法课件_第3页
返回DOS的方法课件_第4页
返回DOS的方法课件_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微型计算机原理与接口技术汇编语言中正确返回DOS的方法,Email:QQ:303450548/冰雪寒秋,S040032014年04月15日(星期二)am10:1012:00,1,PPT学习交流,课外自主学习,阶段复习,第1章第4章,2,PPT学习交流,一、从汇编语言中正确返回DOS的方法,1.利用INT21H中断返回到DOS,INT21H中断是DOS的一个重要中断,可提供许多的系统调用任务,可通过对AH寄存器置子功能的方法来进行指定功能的调用。,(1)INT21H中断的4CH号子功能MOVAH,4CHINT21H如果从程序返回到COMMAND.COM,而不是其他程序,则控制转到COMMAND.COM的驻留部分。并在需要时装入OMMAND.COM的暂存部分。从PSP:000AH中恢复程序结束处理中断向量。从PSP:000EH中恢复CTRL+BREAK向量。从PSP:0012H中恢复严重错误处理描述字变量。刷新文件缓冲区1转到结束处理地址。此方法不依赖任何段寄存器的内容,特别适用于大的EXE文件中。,3,PPT学习交流,一、从汇编语言中正确返回DOS的方法,1.利用INT21H中断返回到DOS,(2)INT21H中断的0H号子功能MOVAH,0INT21H此方法最适合COM格式的文件使用,如果在EXE格式的文件中使用,则应将PSP内容传到该程序的代码段偏移零处,然后再使用该命令。,STASEGMENTSTACK;堆栈段DB100DUP(0)STAENDSCODESEGMENTORG100HASSUMEDS:CODE,ES:CODEASSUMECS:CODE,SS:STASTART:MOVAX,CODEMOVES,AX;设置目的地址段码XORDI,DI;偏移量清零XORSI,SIMOVCX,80H;设置字节数,REPMOVSB;传送程序前缀80H字节PUSHESPOPDS;设置数据区段地址MOVDX,OFFSETMSGMOVAH,9INT21H;字符串显示MOVAH,0INT21H;返回DOSMSG:DB本程序运行结束,07H,0AH,0DH,$CODEENDSENDSTART,4,PPT学习交流,一、从汇编语言中正确返回DOS的方法,1.利用INT21H中断返回到DOS,(3)利用INT21H中断的31H号子功能用于驻留驱动程序或子程序,可以将长度大于64K的文件常驻内存,打开的文件不自动关闭。退出前需要将内存分配块节的长度置于寄存器DX中。,STASEGMENTSTACK;堆栈段DB100DUP(0)STAENDSCODESEGMENT;段代码ASSUMEDS:CODE,ES:CODEASSUMECS:CODE,SS:STASTART:MOVAX,CODEMOVDS,AXMOVDX,OFFSETMSG,MOVAH,9INT21H;显示字符信息MOVDX,2000HMOVAX,3100HINT21H;程序驻留退回DOSMSG:DB本程序运行结束,07H,0AH,0DH,$CODEENDSENDSTART,5,PPT学习交流,一、从汇编语言中正确返回DOS的方法,2.利用INT20H中断返回DOS,INT20H中断只能使应用程序返回DOS,如果是EXE文件,应将程序的偏移地址定义在100H处,然后在应用程序的开始把程序段前缀(PSP)的内容(80H字节)传送至重定位后的代码段偏移零处,然后用INT20H来结束程序运行1对于COM文件可不加限制。,STASEGMENTSTACK;堆栈段DB100DUP(0)STAENDSCODESEGMENTORG100HASSUMEDS:CODE,ES:CODEASSUMECS:CODE,SS:STASTART:MOVAX,CODEMOVES,AX;设置目的地址段码XORDI,DI;偏移量清零XORSI,SI,MOVCX,80H;设置字节数REPMOVSB;传送程序前缀80H字节PUSHESPOPDS;设置数据区段地址MOVDX,OFFSETMSGMOVAH,9INT21H;字符串显示INT20H;通过INT20H返回DOSMSG:DB本程序运行结束,07H,0AH,0DH,$CODEENDSENDSTART,6,PPT学习交流,一、从汇编语言中正确返回DOS的方法,3.利用INT27H中断返回DOS,INT27H中断结束进程,但不释放内存。在发出INT27H指令前,应在DX寄存器中放入常驻内存程序的长度。只能将小于64K的程序驻留内存。,STASEGMENTSTACKDB100DUP(0)STAENDSCODESEGMENTASSUMEDS:CODE,ES:CODEASSUMECS:CODE,SS:STASTART:MOVAX,CODEMOVDS,AX;设置显示数据段指针,MOVDX,OFFSETMSGMOVAH,9INT21H;显示/本程序运行结束0MOVDX,8AHINT27H;驻留程序返回DOSMSG:DB本程序运行结束,07H,0AH,0DH,$CODEENDSENDSTART,7,PPT学习交流,一、从汇编语言中正确返回DOS的方法,4.利用远过程调用返回DOS,将应用程序定义为远过程,并在程序开始处保持PSP段地址和零偏移地址,然后在程序结束处使用RET指令即可转到程序段前缀的开始处。由于此地址已经予先存了一条INT20H指令,因此可以顺利返回DO。,STASEGMENTSTACK;建立堆栈DB100DUP(0)STAENDSCODESEGMENTASSUMEDS:CODE,ES:CODEASSUMECS:CODESTARTPROCFAR;定义远过程PUSHDS;保存PSP段地址XORAX,AX;清零PUSHAX;保存零偏移地址,MOVAX,CODEMOVDS,AXMOVDX,OFFSETMSGMOVAH,9;显示字符串INT21HRET;通过堆栈返回程序段前缀起始处MSG:DB本程序运行结束,07H,0AH,0DH,$CODEENDSSTARTENDPENDSTART,8,PPT学习交流,二、从DOS可执行程序结构看汇编语言源程序的结构,在MSDOS中,有两种类型的可执行程序:.COM程序.EXE程序,8086/8088汇编语言也有相应两种程序结构的文件,可分别编译最终形成.COM程序和.EXE程序,9,PPT学习交流,1代码段的基本组成,(1)8086/8088汇编语言程序的.EXE文件(“标准序”)结构,汇编语言程序是DOS的一个子程序,所以要把汇编语言程序的主体部分定义成一个远过程,以便由DOS调用该过程,在程序结束时用RET指令返回DOS。,格式为:过程名PROCFAR.RET过程名ENDP,为了在程序结束时用RET指令能正确返回DOS,在代码段的开始处,必须保存DOS现场即保存返回地址,保存返回地址的指令为:,PUSHDSSUBAX,AXPUSHAX,10,PPT学习交流,1代码段的基本组成,(2)8086/8088汇编语言程序的.COM文件结构形式,使用.COM文件时,程序不分段,其入口点必须是0100H,也不必设置堆栈段,且对所有的过程均应定义为NEAR属性。,11,PPT学习交流,2.程序的加载,程序的加载是指将.EXE文件或.COM文件装入内存并执行。,程序装入内存时,DOS还在它的前面安装一个256(100H)字节长的程序段前缀(ProgramSegmentPrefix),作为DOS与运行程序的软件接口。,加载一个程序是由DOS的4BH号系统功能来完成的。,12,PPT学习交流,(1)程序段前缀(PSP),程序段前缀(PSP)简言之就是一个数据结构,它和用户程序本身位于同一内存分配块中,构成一个不可分割的整体。它是DOS(作为加载程序的父程)和被加载程序的软件接口。它主要是用来存放与用户程序有关的一些控制信息,并提供程序正常或异常结束时返回DOS的途径。它总共有256个字节长,位于程序所在段的起始位置。,PSP的DOS结构,13,PPT学习交流,(2).COM文件的内存映象,一个.COM程序存储在磁盘中的内容同执行时装进内存的内容完全一致。执行时只是简单地将.COM程序拷贝到程序段前缀的紧上端,起始地址为100H。,.COM文件装入内存后的映象,14,PPT学习交流,(2).COM文件的内存映象,一个.COM程序存储在磁盘中的内容同执行时装进内存的内容完全一致。执行时只是简单地将.COM程序拷贝到程序段前缀的紧上端,起始地址为100H。,.COM文件装入内存后的映象,(1)当一个.COM程序开始执行时,所有的段寄存器(CS,DS,SS和ES)都含有相同的值,都是程序段前缀(PSP)所在段的段地址。即4个段实际上是同一物理段,段的最大长度为64KB,这也是.COM文件长度的最大限度。(2).COM程序是从偏移地址值为100H处开始执行的。DOS强行设置IP=0100H,即初始的CS:IP规定指向PSP之后的第一个字节位置。于是在编写.COM文件源程序时,在用ORG100H伪指令预留PSP空间后,其后的第一条指令应该是一条可执行的指令。(3)整个.COM程序必须在一个物理段(64KB)内,段尾处的一个字作为堆栈使用。在将控制权移交给.COM程序前,MS-DOS总要将一个字0压进堆栈。减去这个字和程序段前缀占用的256个字节空间,余下的空间便是.COM程序可以使用的空间。也就是说,.COM程序的所有代码和数据至多使用65,536-2-256=65,278字节的存储空间。(4).COM文件源程序中不用设置堆栈段。堆栈指针寄存器SP指向该.COM程序可使用的存储器的最高端下面的一个字,即如果至少有64KB存储空间可供使用,则SP寄存器的值为OFFFDH。DOS强行设置SSPSP段地址,SPOFFFDH。,15,PPT学习交流,(3).EXE文件的内存映象,.EXE文件结构,一个.EXE文件的源程序经汇编程序汇编后产生目标文件,目标文件经连接程序的组合分类定位后,产生的.EXE文件是一个可执行的浮动代码文件。该文件在磁盘空间内是由两部分组成的:一部分为头部信息块,另一部分为浮动的装入模块。头部信息又分为前部的格式化区(30字节)和后部的重定位项表,主要是用来说明如何装入代码和数据段。,.EXE文件的磁盘空间结构,在文件装入时虽曾被读入内存高端缓冲区,但在分析使用后即被丢弃,真正留于内存空间的只是装入模块。,16,PPT学习交流,(3).EXE文件的内存映象,.EXE文件的的内存映象,.EXE文件装入内存的只是装入模块本身,DOS同时还为用户程序安装一个256字节长的程序段前缀。.EXE程序执行时也是装入在程序段前缀的紧上端,但代码段,数据段和堆栈段具体装到内存何处,要由MS-DOS提供的4BH号系统功能调用根据.EXE文件头中的信息来确定。,.EXE文件的内存映象,由此内存映象图可看出:(a).EXE文件的程序中可有代码段、数据段、附加段和堆栈段4个分段,最能体现Intel80 x86体系存储器地址分段结构的特点,便于组织大型应用程序。(b)DOS对.EXE文件的长度没有约束,可以占用全部用户程序空间。(c).EXE文件的源程序中应该定义一个堆栈段,此段或者具有STACK组合类型,或者用ASSUME语句把段名和SS段寄存器联系起来,或者两者兼用之。在用户程序装入内存时,装入程序自动令SS:SP指向这个堆栈区的底部,源程序不用设置SS和SP。(d).EXE文件的源程序中不应设置初始的CS和IP值,而应该使用END启动标号这样的伪指令来说明启动点,加载时CS:IP寄存器会自动指向程序中第一条可执行指令处。,17,PPT学习交流,.EXE文件的内存映象,(e).EXE程序装入内存后,DS和ES寄存器中的值均为程序段前缀PSP的段地址,同时从程序段前缀结构示意图(PSP的DOS结构)中可看出,程序段前缀PSP中的头两个字节的内容是十六进制“CD20”与8086/8088指令“INT20H”相对应,该指令的作用是程序非驻留退出时的结束指令,但发出此软中断指令时,要求CS段寄存器一定要为程序段前缀PSP的段地址。故在.EXE(“标准序”)结构中利用DS在堆栈中保存程序段前缀的段地址,利用SUBAX,AX和PUSHAX指令来保存程序段前缀中INT20H指令的首地址。PUSHDS;保存PSP段地址SUBAX,AXPUSHAX;INT20H指令所在第一个字节;的偏移地址为0。其次,主过程又定义为远过程,因此RET是一个远程(段间)返回指令。于是,程序最后执行RET指令时将使CS=PSP的段地址,IP=0000H。这样一来系统就会自动转移到PSP+00H,从而正确执行“INT20H”指令,完成程序的结束退出。标准序还有另外一个优点:程序的主体呈现为一个远过程的结构,也便于程序模块化。,18,PPT学习交流,3.COM程序与.EXE程序的比较,.COM程序由程序本身的二进制代码组成,它没有.EXE程序所具有的格式化区和重定位项表,也就免去了最后修正装入模块中某些位置的机器码,所以它占有的存储空间比.EXE程序要小.COM程序又不允许分段,它所占有的存储空间不允许超过64KB,因而只能用来编制较小的程序,由于其规模小而简单,所以.COM程序的装入速度比.EXE程序的装入速度要快得多。DO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论