汇编与执行一个程序课件_第1页
汇编与执行一个程序课件_第2页
汇编与执行一个程序课件_第3页
汇编与执行一个程序课件_第4页
汇编与执行一个程序课件_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

第4章汇编与执行一个程序4.1汇编与执行一个程序4.2COM文件4.3汇编语言程序的编辑、汇编、链接与调试第4章汇编与执行一个程序4.1汇编与执行一个程序4.1汇编与执行一个程序

当你编写好一个汇编语言源程序后,需要进行以下的处理过程,计算机才能执行。首先用编辑程序DOSEDIT或其他的编辑程序,将其输入到计算机中。然后,存入磁盘生成汇编语言源程序文件(ASM文件)。源程序不能被计算机直接执行,所以要经过汇编程序加以翻译,这个翻译过程称为编译过程或汇编过程,就是把源程序文件翻译成二进制代码所表示的目标文件—— OBJ文件。4.1汇编与执行一个程序当你编写

在汇编过程中,汇编程序将会对源程序进行扫描,若源程序中有语法错误,则汇编结束后,汇编程序将指出源文件中的语法错误,你可以重新使用编辑程序来修正源程序中的语法错误,直至得到无误的ASM文件和OBJ文件。

OBJ文件虽然已是二进制机器指令码的形式,但计算机仍不能直接执行。还必须用链接程序(LINK.EXE),把目标文件与库文件或其它目标文件进行链接和在内存中重新定位,生成可直接执行文件(EXE文件)。这时的EXE文件才可以由DOS装入内存储器并运行。汇编过程如图4-1所示。在汇编过程中,汇编程序将会对源程序进图4-1汇编语言的汇编过程图4-1汇编语言的汇编过程4.1.1键入与编辑一个源程序例4.1

两个十六进制数0123、0025相加,将结果存入BX寄存器中。源程序清单如下:;filename:L41.ASMSTACKSGSEGMENTPARASTACK‘STACK’DB12DUP(‘STACKSEG’)STACKSGENDS;—————————————————————CODESGSEGMENTPARA‘CODE’4.1.1键入与编辑一个源程序BEGINPROCFARASSUMESS:STACKSG,CS:CODESG,DS:NOTHINGPUSHDSSUBAX,AXPUSHAXMOVAX,0123HADDAX,0025HMOVBX,AXRETBEGINENDPCODESGENDSENDBEGINBEGINPROCFAR(1)程序中有一个代码段和一个堆栈段,因为不需要数据段和附加段,所以未设定。

(2)用全屏幕编辑程序EDIT.COM建立源程序,文件名取L41.ASM。在DOS状态键入EDIT即可。如:

C:\>EDITL41.ASM[并按下Enter键](3)回车后,屏幕上出现EDIT的全屏幕窗口,此时就可以输入或编辑源程序了。当输入、编辑完源程序后,用EDIT的下拉菜单项:“FILE”中的“SAVE”项将源文件L41.ASM存入磁盘,这时你的磁盘上就建立了一个名为L41.ASM的汇编语言源程序文件。(有关EDIT.COM的使用和操作,请读者参考本章4.3节。)(1)程序中有一个代码段和一个堆栈段,因4.1.2汇编一个程序当你把源程序键入并以名称L41.ASM存入磁盘后,在执行它之前还有两个重要步骤

——汇编和链接。

1.汇编

L41.ASM源程序文件建立后,用汇编程序将该文件翻译为二进制机器指令码,并产生一个OBJ目标文件(L41.OBJ),这个翻译过程称为汇编。常用的汇编程序是宏汇编MASM.EXE或小汇编ASM.EXE。它的主要功能是:4.1.2汇编一个程序(1)检测源程序中的语法错误,并在屏幕上显示出错信息。

(2)展开宏指令(将在第14章中介绍)。

(3)产生目标文件,并同时产生列表文件LST和交叉参考表文件CRF。注意:在DOS状态下键入MASML41,即可实现对L41.ASM的汇编。操作和汇编过程如图4-2所示。(1)检测源程序中的语法错误,并在屏幕(1) C:>MASML41(2) Microsoft(R)MacroAssemblerVersion5.00Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.(3) Objectfilename[L41.OBJ]:Sourcelisting[NUL.LST]:L41Cross-reference[NUL.CRF]:L41图4-2L41.ASM的汇编过程(1) C:>MASML41图4-2L41.ASM

图中,(1)是汇编命令输入;(2)是版本说明以及出版时间;(3)提示你默认使用相同的文件名(但你可以改变它),按Enter键即可。再提示你默认不要汇编后程序的列表文件。若不需要只需按Enter键。若要此列表文件,可以键入:

L41[按下Enter键]

最后提示你默认不要汇编后程序的交叉参考表文件。若不需要只需按Enter键。若要此参考表文件,可以键入:

L41[按下Enter键]图中,(1)是汇编命令输入;(2)是版本说L41.LST是列表文件,这个文件可同时列出源程序和机器语言程序清单并给出符号表,帮助你调试程序。这时在你的磁盘上就建立了L41.LST文件,可以在DOS状态下,用TYPE命令显示或打印它的内容,如:

C:\>TYPEL41.LST

结果显示在屏幕上,如图4-3所示。若想打印此显示,按Ctrl+P键将打印机连接即可。L41.LST是列表文件,这个文件可同时列1;filenamel41.asm20000 STACKSGSEGMENTPARASTACK‘STACK’30000000C[DB12DUP(‘STACKSEG’)4 535441434B 5 534547 6 ] 7 80060STACKSGENDS90000CODESG SEGMENTPARA‘CODE’100000BEGIN PROCFAR1;filenamel41.asm11 ASSUMESS:STACKSG,CS:CODESG,DS:NOTHING1200001E PUSHDS1300012BC0 SUBAX,AX14000350 PUSHAX150004B80123 MOVAX,0123H160007050025 ADDAX,0025H17000A8BD8 MOVBX,AX18000CCB RET11 ASSUMESS:STACKSG,C19000DBEGINENDP20000DCODESGENDS21 ENDBEGINSegmentsandGroups:NameLengthAlign CombineClassCODESG.............000D PARA NONE ‘CODE’STACKSG............0060 PARA STACK ‘STACK’Symbols:Name Type Value AttrBEGIN............. FPROC0000 CODESGLength=000D图4-3L41.LST列表文件19000DBEGINENDP图4-3

上述汇编过程,汇编程序将源程序翻译成机器码,并把错误显示在屏幕上。典型的错误一般有:违反命名原则的名称,拼错助记符、运算符(例如将MOV拼成MOVE),以及操作数含有一个未定义的名称等。在汇编程序手册中,你可以找到这些错误码的解释,大约共有100条错误信息。注意:你必须再重新键入编辑程序,在编辑状态下更正源程序,然后再重新汇编,直至产生OBJ文件,才能进行下一步。上述汇编过程,汇编程序将源程序翻译成

图4-3是已汇编过的列表文件,汇编程序以L41.LST名称将它存入磁盘。列表的顶端是堆栈段。SEGMENT、PROC、ASSUME以及END伪指令均不产生机器指令码。此列表不仅显示了源程序的符号指令码,同时把汇编后的机器码以十六进制格式显示在左边。最左边是序号,紧接着是堆栈段或数据段定义的数据或资料以及指令段指令的十六进制偏移地址。图4-3是已汇编过的列表文件,汇编程

堆栈段起始于0000处。当装入内存时,它依据SS寄存器的内容作为堆栈的起始地址,并从此位置计算起,其差距为0个字节处的位置。SEGMENT伪指令中的PARA使得堆栈段定位在可以被16整除的地址。SEGMENT伪指令还通知汇编程序这是一个堆栈——不产生机器指令码。DB伪指令也是对齐在地址0000处,含有12份“STACKSEG”字符串,其机器码是十六进制OC(十进制12)和ASCII码的十六进制表示法。稍后你可以利用DEBUG来观察存储器中的结果。堆栈段于地址Hex0060处结束,即十进制96(12×8)。堆栈段起始于0000处。当装入内存时

指令段也起始于地址0000处。当装入内存时,它是依据CS寄存器的内容作为地址,并从此地址算起,其差距为0处。由于ASSUME是伪指令,所以第一个产生实际机器码的指令是PUSHDS,它是一条1字节长度的指令(1E),位于差距为0的位置(即偏移地址为0000)。次一条指令是SUBAX,AX,它是一条2个字节长度的指令(2BC0),放在指令段起始差距为0001的地址,即偏移地址为0001。在例4.1中机器指令的长度有1个字节、2个字节和3个字节。最后一条指令是END,它含有操作数BEGIN,与指令段地址0000的PROC名称有关。此地址就是装入程序后,开始执行程序的地址。指令段也起始于地址0000处。当装2.符号表紧接在程序列表之后的是符号表。第一部分是一个段表,含有在程序中所有定义的段与段组(Groups),以及它们所占的字节长度、定位方法和组合形式。第二部分是一个符号表——含有数据段内各数据栏的名称即变量名。例4.1中不存在此项。符号表中还含有指令段内提供给指令使用的符号名和变量名,例4.1中只有一个BEGIN过程名。2.符号表3.两次扫描汇编程序对源程序汇编时需要经过两次扫描。其原因之一是向前参考,就是指令可能参考到汇编程序尚未汇编到的标号。在第一次扫描时,汇编程序扫描整个源程序,并将程序所用到的名称与标号建立一个符号表,亦即数据段的变量名与指令段的标号名和过程名,以及它们在程序中的相对地址。第一次扫描决定了将要产生的机器码长度,但并不产生目的码。3.两次扫描

在第二次扫描时,汇编程序使用第一次扫描所建立的符号表。目前它已知道每个数据栏的长度和指令的长度以及相对地址。所以,它能确定每一条指令所对应的目的码。之后,汇编程序可以依据命令需求而产生OBJ、LST与CRF文件。在第二次扫描时,汇编程序使用第一次扫4.1.3链接一个程序

OBJ文件几乎是可以执行的目标文件形式,但还不能直接执行。DOS的链接程序LINK.EXE就可生成可执行文件EXE,链接文件做下列工作。

(1)对汇编程序在OBJ文件中留下的空白进行定址。你可以在稍后的LST文件所列出的目的码中看到如-R之类的内容,L41.LST文件所列出的目的码中没有此项。4.1.3链接一个程序(2)若有两个以上的汇编过的OBJ文件,要链接起来而成为一个可执行的文件(EXE)时,就需做结合的工作。例如,两个以上的汇编语言程序或一个汇编语言程序与一个用高级语言编写的程序(C或BASIC)进行结合。

(3)利用适当的指令初始化EXE文件,以便以后能正确装入内存并执行之。键入LINKL41并按下Enter键即可执行对L41的链接,接着系统会给出一连串的提示内容并等着你回答,如图4-4所示。(2)若有两个以上的汇编过的OBJC:>LinkL41RunFile[L41.EXE]:ListFile[NUL.MAP]:CONLibraries[.LIB]:图4-4LINKL41执行过程C:>LinkL41图4-4LINKL41执行过程

第一个提示要求你输入可执行文件名(使用与源文件相同的文件名即可)。第二个提示告诉你,LINK将默认为NUL.MAP(即不要MAP文件)。MAP文件含有各段的大小与名称表,以及LINK所发现的错误。一个典型的错误是堆栈段没有定义成功。CON回答告诉LINK在屏幕上显示此文件,而不存入磁盘,这样可以节省磁盘空间,并允许你立即查看MAP文件。例4.1中,L41.MAP文件的内容如下所示:第一个提示要求你输入可执行文件名(使

起始地址结束地址长度名称类型

00000H0005FH00060HSTACKSGSTACK00060H0006CH0000DHCODESGCODE

第三个提示的回答是按下Enter键,它告诉LINK其余的选项均采用默认值。DOS手册中包含了对这些选项的说明。在这个过程中,唯一最可能出现的错误是输入了错误的文件名。解决方法是重新启动LINK再作一遍。起始地址结束地址长度名4.1.4执行一个程序当你把OBJ文件(一个或多个)进行链接,生成一个EXE文件后,就可以不限次数地执行这个EXE文件了。但当你需要改变EXE文件时,就必须修改其源程序,然后再重新汇编生成另外一个OBJ文件,最后再重新链接此OBJ文件,重新生成EXE文件。经过汇编、链接过程后,生成可执行文件EXE,现在你就可以执行这个程序了。键入以下命令以执行此程序:

C:\>L41.EXE或C:\>L414.1.4执行一个程序DOS会将扩展名为EXE(或COM)的文件装入内存并执行。然而,此程序未编写显示功能,无法在屏幕上看到结果。例4.1程序的执行结果被存入内存单元,可以利用DEBUG程序的追踪命令(T)逐条执行指令,观察每一步骤的结果。有关DEBUG的用法请参阅第2章2.4节。DOS会将扩展名为EXE(或COM)4.2COM文件

程序经过汇编、链接都会产生EXE格式的可执行文件。EXE文件在链接的过程中会自动地产生一个至少占有512个字节的文件头特殊记录格式,并被安置在磁盘文件(EXE)的开头位置。但你也可以产生一个可执行的COM文件。例如,COMMAND.COM就是一个最常用的COM文件。EXE2BIN.COM是一个DOS系统程序,它可以将EXE文件转换成COM文件。4.2COM文件程序经过汇编4.2.1EXE文件与COM文件的差异虽然COM文件是利用EXE2BIN程序将EXE文件转换而成的,但是它们彼此之间仍存在着很大的差异,主要表现在下列几点。

(1)程序大小。一个EXE文件可以为任意大小,然而一个COM文件被限制在一个段内,最大为64K字节。COM文件总是比原来的EXE文件小,其中一个原因是512个字节的文件头被放置在EXE文件的开始部分,但在COM磁盘文件中却没有。4.2.1EXE文件与COM文件的差异(2)堆栈段。一个EXE文件需要自己定义堆栈段,然而系统会自动为COM文件产生堆栈段。因此,当你编写一个将被转换成COM文件的汇编文件时,可以省略定义堆栈段。

(3)数据段。一个EXE文件通常会定义一个数据段(在需要时),并且将DS寄存器指向数据段的起始地址。COM文件只能在代码段中定义它的资料或数据。

(4)初始化。EXE文件在刚开始时,要求堆栈段没有任何内容(是空的),并要求设定DS寄存器的初值。因为COM文件并没有堆栈段,也没有数据段,所以省略了这些步骤。(2)堆栈段。一个EXE文件需要自

当COM文件初始化时,所有的段寄存器都指向程序段的前缀PSP(ProgramSegmentPrefix)的开始,PSP是一块占用256字节的内存区域。当COM与EXE被装入存储器时,DOS会自动地将PSP加在程序开始处的前面。由于程序真正的开始位置是相对于PSP起始位置的相对位移100H的地方,因此,在对代码段定义之后,COM文件应使用一条ORG100H伪指令,设定程序的起始地址,以便使程序跳过PSP。接着使用一条JMP指令,跳到程序的真正开始处,如例4.2所示。当COM文件初始化时,所有的段寄存器(5)转换。对于EXE及COM两种格式的程序,汇编、链接程序是没有区别的。汇编产生一个OBJ文件,然后链接该OBJ文件,产生一个EXE文件。如果原先是以EXE文件格式,所编写的程序现在就可以执行。如果原先所编写的程序是COM格式,链接程序会产生一个提示信息:

Warning:NoSTACKSegment(5)转换。对于EXE及COM两

对于这个信息,可以忽略,因为它是假定必须定义堆栈段。利用EXE2BIN程序,再将EXE文件转换成COM文件。假如你有一个源程序是EXE的格式,你可以使用编辑软件修改一些指令,而使其成为COM文件的格式。对于这个信息,可以忽略,因为它是假定4.2.2COM文件范例例4.2COM文件程序范例。该程序是将两个字单元FLDA、FLDB内容相加,结果存入FLDC单元中。这个程序有以下特点:

(1)没有堆栈段和数据段。

(2) ASSUME告诉汇编开始的相对地址,是从代码段的开始算起。CS寄存器包含PSP的开始地址。用ORG伪指令跳过PSP,将程序指针指向指令段地址第100H个字节处。4.2.2COM文件范例(3) JMP指令转移执行程序的控制权,以便跳过数据定义部分。源程序清单如下:;filename:L42.ASMCODESEGMENTASSUMECS:CODE,DS:CODE,SS:CODE,ES:CODE ORG100H;程序起始放在PSP之后BEGIN:JMPMAIN;跳过数据区;—————————————————————(3) JMP指令转移执行程序的控制权,以便跳过数据定义部FLDADW250OH ;定义数据

FLDBDW125OHFLDCDW?;—————————————————————MAINPROCNEARMOVAX,FLDA ;AX=0250ADDAX,FLDB ;Add0125toaxMOVFLDC,AX ;Storesuminfldc

RET ;ReturntodosFLDADW250OH ;定MAINENDPCODEENDSENDBEGINMAINENDP4.2.3COM文件的堆栈对于COM文件,DOS会自动地定义堆栈段,并且设定相同的段地址给四个段寄存器(CS、DS、ES、SS)。若64K的地址范围足够存放你的程序,即你的程序长度比64K小得多,DOS会将SP寄存器指向此段的结束位置,将其当作堆栈的顶点,其地址(即偏移地址)为FFFFH。假设64K的地址范围,不足以提供足够的空间给堆栈使用,DOS将堆栈设在存储器结束的地方。对于上述两种情况,DOS都会将空字符放入堆栈中。4.2.3COM文件的堆栈

若你的程序很大或者受存储器的限制,在堆栈中压入字内容时,你必须很小心地处理。使用时应当利用DIR命令或其他方法,以便了解一个文件的大小,它将帮助你了解堆栈的可使用空间。若你的程序很大或者受存储器的限制,在4.3汇编语言程序的编辑、汇编、

链接与调试

这一节是对本章内容的练习,通过对汇编语言源程序的编辑、汇编与链接过程的练习与上机操作,可帮助你加深了解可执行文件EXE的初始化需求,掌握使程序正确返回DOS的方法。另外,还要练习如何将EXE文件转换成为COM文件以及COM文件对程序格式的需求。4.3汇编语言程序的编辑、汇编、

链接与调试练习中所使用的软件如下:(MSDOS环境下)(1)全屏幕编辑软件Edit。(2)宏汇编MASM。(3) TASM汇编。练习内容:(1)显示HELLO字符十次,用RET返回DOS。(2)显示HELLO字符五次,用INT21H返回DOS。(3)将EXE文件转换为COM文件。练习中所使用的软件如下:(MSDOS环境下)4.3.1练习一:显示HELLO十次1.程序清单

;filenameL43.ASM;—————————————————————DATASEGMENT;定义数据段

MESGDB‘HELLO’,0DH,0AH,‘$’;定义字节型字符串0DH回车符、0AH换行符

DATAENDS ;定义数据段结束4.3.1练习一:显示HELLO十次;—————————————————————CODESEGMENT ;定义指令段

ASSUMECS:CODE,DS:DATA ;指明段寄存器所对应的段

MAIN PROCFAR;定义过程或子程序PUSH DS ;保存返回地址

MOV AX,0 PUSH AX MOV AX,DATA;设置数据段初值;—————————————————————MOV DS,AX MOV CX,10;设置循环次数

LAST: MOV AH,09;DOS功能调用09→AH MOV DX,OFFSETMESG ;返回MESG的偏移地址

INT 21H ;DOS功能调用

LOOP LAST ;CX-1→CX,CX≠0转LAST

MOV DS,AXRET;返回DOSMAIN ENDP;定义过程结束

CODE ENDS;定义指令段结束

ENDMAIN;源程序结束RET

说明:

(1)该源程序含有两个段,数据段DATA与指令段CODE。

(2)数据段定义了“HELLO”字符串,0DH回车符,0AH换行符。

(3) MOVAH,09是将DOS功能调用号09送AH。09号DOS功能调用的入口参数要求:09→AH,DS:DX指向字符串首地址,而且字符串必须以“$”结尾。

(4) ASSUME伪指令,指明各段对应的寄存器;DS对应数据段,CS对应指令段。说明:(5) MAINPROCFARSTART:PUSHDS MOVAX,0PUSHAX…RETMAINENDPDOS将MAIN视为一个子程序调用,并用RET返回。(5) MAINPROCFAR

为数据段寄存器赋初值

(6) MOVAX,DATA MOVDS,AX(7) MOVDX,OFFSETMESG是09号DOS功能调用要求的,将MESG的地址返回给DX。

(8) ENDMAIN:源程序结束。定义代码段(9) CODESEGMENT… CODEENDS定义代码段为数据段寄存器赋初值定义代码段(10) LOOP是一条循环指令,其操作首先执行CX-1→CX,然后判断CX是否等于0,若CX≠0则转到LAST,若CX=0则执行LOOP的下一条指令。

2.操作步骤第一步:用EDIT编辑汇编语言源程序文件,命名为L43.ASM。显示操作D\>EDIT回车(10) LOOP是一条循环指令,其操作

进入EDIT软件全屏幕编辑状态,按程序清单逐条输入源程序。第二步:存盘。在编辑状态下,输入完源程序之后,按ALT+F键下拉菜单出现,选择下拉菜单中的SAVE保存文件。注意,文件名的扩展名必须是 .ASM,例如:L43.ASM。第三步:退出EDIT。存盘后按ALT+F键,选择下拉菜单中的EXIT即退出EDIT,返回DOS状态。进入EDIT软件全屏幕编辑状态,按程第四步:对源程序进行汇编。显示操作D\>MASML43;回车

汇编结束后会提示错误信息和出错的行号,请记录下出错的行号。从第一步开始,重新进入编辑状态,在编辑状态下改错。显示操作D\>EDITL43.ASM回车第四步:对源程序进行汇编。D\>MASML43;回车

调出源程序修改错误,直到全部正确。重新存盘、汇编,汇编正确无误后会产生目标文件L43.OBJ;若有错误,则不会产生目标文件L43.OBJ。第五步:链接目标文件。显示操作D\>LINKL43;回车调出源程序修改错误,直到全部正确。重新

链接成功后会产生可执行文件L43.EXE。链接过程中除了操作时输入的命令符有可能出错,一般无错误。第六步:执行可执行文件L43.EXE。显示操作D\>L43回车

屏幕上显示十个HELLO字符串。练习一完成。链接成功后会产生可执行文件L练习二:显示HELLO五次1.程序清单

;filename:L44.ASM;—————————————————————DATA SEGMENTMESG DB‘HELLO’,0DH,0AH,‘$’DATA ENDS;—————————————————————CODE SEGMENT ASSUMECS:CODE,DS:DATA4.3.2练习二:显示HELLO五次START: MOVAX,DATA MOVDS,AX MOVCX,5LAST: MOVAH,09 MOVDX,OFFSETMESG INT21H LOOPLASTSTART: MOVAX,DATA MOVAH,4CH INT21H MAINENDPCODE ENDS ENDSTART MOVAH,4CH

说明:

(1)练习一与练习二相同,均是用DOS功能调用INT21H(功能号09)显示一个字符串。

(2)不同的是练习二的程序没有以子程序的方式编写;返回DOS的方法,使用DOS功能调用INT21H,功能号为4CH。

2.操作步骤第一步:编辑源程序文件。提示:练习二与练习一的程序仅返回DOS的方法不同,程序指令部分完全相同,若使用练习一的源程序文件进行修改会很方便。说明:

显示操作

进入编辑状态,更改文件名L43.ASM为L44.ASM。操作如下:按ALT+F键下拉菜单出现,选择SAVE-AS将L43.ASM重新命名为L44.ASM。然后,按L44.ASM当前源程序修改并存盘、汇编,链接产生可执行文件L44.EXE,最后执行L44.EXE文件。方法参考练习一的第一步至第六步。D\>EDITL43.ASM回车显示操作D\>EDITL43

进入编辑状态,更改文件名L43.ASM为L44.ASM。操作如下:按ALT+F键下拉菜单出现,选择SAVE-AS将L43.ASM重新命名为L44.ASM。然后,按L44.ASM当前源程序修改并存盘、汇编,链接产生可执行文件L44.EXE,最后执行L44.EXE文件。方法参考练习一的第一步至第六步。进入编辑状态,更改文件名L43.AS3.用DEBUG调试该程序可执行文件L44.EXE可以在DOS下直接执行,显示五个HELLO字符。也可以用DEBUG逐条追踪调试,方法如下。第一步:将L44.EXE装入内存。 显示操作D\>DEBUGL44.EXE回车3.用DEBUG调试该程序D\>DE

第二步:反汇编L44.EXE。注意:观察源程序清单中的各条可执行指令在装入内存中是如何表示的,对照源程序清单逐条阅读理解。显示操作-U回车(或U0000回车)

显示:15A9:0000B8A815 MOV AX,15A8第二步:反汇编L44.EXE。-U回车15A9:00038ED8 MOV DS,AX15A9:0005B90500 MOV CX,000515A9:0008B409 MOV AH,0915A9:000ABA0000 MOV DX,000015A9:000DCD21 INT 2115A9:00038ED8 MOV

说明:

(1) 15A9:0000表示EXE文件存放在指令段偏移地址0000处。

(2)第1、2条指令确定数据段的段值,其位置在代码段的前面一小节位置处。例如:代码段地址为15A9:0000,而MOVAX,15A8指令中指出DS为15A8,它就是数据段的起始地址15A8:0000。

(3) MOVDX,OFFSETMESG会变为MOVDX,0000,符号地址MESG会变为实际偏移地址0000。说明:

第三步:查看数据段内容。根据第一条指令MOVAX,15A8,可以确定数据段的起始地址是15A8:0000。(注意:应按你所使用的系统显示来确定。)

显示操作-D15A8:0000回车显示:15A8:000048454C4C4F0D0A24-0000000000000000HELLO..$........可以观察到数据段存储的字符串“HELLO”与“$”。第三步:查看数据段内容。显示:

第四步:单步追踪程序。注意:软中断指令INT21H不能用T命令直接执行,当执行到INT21H时应按下述方法操作,跳过INT21H。显示操作15A9:000DCD21INT21H-G000F回车

这时屏幕会显示HELLO字符,下面仍可继续使用T命令执行。练习二完成。第四步:单步追踪程序。这时屏幕会显4.3.3练习三:COM文件的生成

COM文件不需要分数据段、指令段和堆栈段,数据、堆栈和指令全在一个段内;它们所占有的空间不允许超过64K。因此,在编制较小的程序时很方便,装入速度比EXE文件要快,所占存储空间比EXE文件小。使用COM文件时,程序架构不需要分段,整个程序的入口地址必须是0100H(256),因为前256字节为程序段前缀所占用,不必设置堆栈段。在程序装入内存时,DOS会将SP寄存器指向此段的结束位置,当作堆栈的顶点,其值即偏移地址为FFFFH。4.3.3练习三:COM文件的生成1.COM文件源程序架构;—————————————————————CODESEGMENTASSUMECS:CODE,DS:CODE,SS:CODE(注意:CS、DS和SS均为为CODE)ORG100HBEGIN:JMPSHORTMAIN;—————————————————————1.COM文件源程序架构数据区:DB…DW…;—————————————————————;指令区——————————————————MAINPROC

温馨提示

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

评论

0/150

提交评论