《汇编与执行一个程序.ppt》由会员分享,可在线阅读,更多相关《汇编与执行一个程序.ppt(78页珍藏版)》请在三一办公上搜索。
1、第4章 汇编与执行一个程序,4.1 汇编与执行一个程序 4.2 COM文件 4.3 汇编语言程序的编辑、汇编、链接与调试,4.1 汇编与执行一个程序,当你编写好一个汇编语言源程序后,需要进行以下的处理过程,计算机才能执行。首先用编辑程序DOS EDIT或其他的编辑程序,将其输入到计算机中。然后,存入磁盘生成汇编语言源程序文件(ASM文件)。源程序不能被计算机直接执行,所以要经过汇编程序加以翻译,这个翻译过程称为编译过程或汇编过程,就是把源程序文件翻译成二进制代码所表示的目标文件OBJ文件。,在汇编过程中,汇编程序将会对源程序进行扫描,若源程序中有语法错误,则汇编结束后,汇编程序将指出源文件中的
2、语法错误,你可以重新使用编辑程序来修正源程序中的语法错误,直至得到无误的ASM文件和OBJ文件。OBJ文件虽然已是二进制机器指令码的形式,但计算机仍不能直接执行。还必须用链接程序(LINK.EXE),把目标文件与库文件或其它目标文件进行链接和在内存中重新定位,生成可直接执行文件(EXE文件)。这时的EXE文件才可以由DOS装入内存储器并运行。汇编过程如图4-1所示。,图4-1 汇编语言的汇编过程,4.1.1 键入与编辑一个源程序 例4.1 两个十六进制数0123、0025相加,将结果存入BX寄存器中。源程序清单如下:;filename:L41.ASM STACKSG SEGMENT PARA
3、STACK STACK DB 12 DUP(STACKSEG)STACKSG ENDS;CODESG SEGMENT PARA CODE,BEGIN PROC FAR ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING PUSH DS SUB AX,AX PUSH AX MOV AX,0123H ADD AX,0025H MOV BX,AX RET BEGIN ENDP CODESG ENDS END BEGIN,(1)程序中有一个代码段和一个堆栈段,因为不需要数据段和附加段,所以未设定。(2)用全屏幕编辑程序EDIT.COM建立源程序,文件名取L41.ASM。在DO
4、S状态键入EDIT即可。如:C:EDIT L41.ASM并按下Enter键(3)回车后,屏幕上出现EDIT的全屏幕窗口,此时就可以输入或编辑源程序了。当输入、编辑完源程序后,用EDIT的下拉菜单项:“FILE”中的“SAVE”项将源文件L41.ASM存入磁盘,这时你的磁盘上就建立了一个名为L41.ASM的汇编语言源程序文件。(有关EDIT.COM的使用和操作,请读者参考本章4.3节。),4.1.2 汇编一个程序 当你把源程序键入并以名称L41.ASM存入磁盘后,在执行它之前还有两个重要步骤 汇编和链接。1.汇编 L41.ASM源程序文件建立后,用汇编程序将该文件翻译为二进制机器指令码,并产生一
5、个OBJ目标文件(L41.OBJ),这个翻译过程称为汇编。常用的汇编程序是宏汇编MASM.EXE或小汇编ASM.EXE。它的主要功能是:,(1)检测源程序中的语法错误,并在屏幕上显示出错信息。(2)展开宏指令(将在第14章中介绍)。(3)产生目标文件,并同时产生列表文件LST和交叉参考表文件CRF。注意:在DOS状态下键入MASM L41,即可实现对L41.ASM的汇编。操作和汇编过程如图42所示。,(1)C:MASM L41(2)Microsoft(R)Macro Assembler Version 5.00 Copyright(C)Microsoft Corp 19811985,1987.
6、All rights reserved.(3)Object filename L41.OBJ:Source listing NUL.LST:L41Cross-reference NUL.CRF:L41,图4-2 L41.ASM的汇编过程,图中,(1)是汇编命令输入;(2)是版本说明以及出版时间;(3)提示你默认使用相同的文件名(但你可以改变它),按Enter键即可。再提示你默认不要汇编后程序的列表文件。若不需要只需按Enter键。若要此列表文件,可以键入:L41按下Enter键 最后提示你默认不要汇编后程序的交叉参考表文件。若不需要只需按Enter键。若要此参考表文件,可以键入:L41按下En
7、ter键,L41.LST是列表文件,这个文件可同时列出源程序和机器语言程序清单并给出符号表,帮助你调试程序。这时在你的磁盘上就建立了L41.LST 文件,可以在DOS状态下,用TYPE命令显示或打印它的内容,如:C:TYPE L41.LST 结果显示在屏幕上,如图4-3所示。若想打印此显示,按Ctrl+P键将打印机连接即可。,1;filenamel41.asm 2 0000STACKSG SEGMENT PARA STACK STACK 3 0000 000CDB 12 DUP(STACKSEG)4 53 54 41 43 4B 5 53 45 47 6 7 8 0060 STACKSG EN
8、DS 9 0000 CODESG SEGMENT PARA CODE 10 0000 BEGIN PROC FAR,11ASSUME SS:STACKSG,CS:CODESG,DS:NOTHING 12 0000 1E PUSH DS 13 0001 2B C0 SUB AX,AX 14 0003 50 PUSH AX 15 0004 B8 0123MOV AX,0123H 16 0007 05 0025 ADD AX,0025H 17 000A 8B D8 MOV BX,AX 18 000C CB RET,19 000D BEGIN ENDP 20 000D CODESG ENDS 21EN
9、D BEGIN Segments and Groups:Name Length AlignCombine ClassCODESG.000DPARANONECODESTACKSG.0060PARASTACKSTACKSymbols:Name Type ValueAttrBEGIN.F PROC0000 CODESG Length=000D,图4-3 L41.LST列表文件,上述汇编过程,汇编程序将源程序翻译成机器码,并把错误显示在屏幕上。典型的错误一般有:违反命名原则的名称,拼错助记符、运算符(例如将MOV拼成MOVE),以及操作数含有一个未定义的名称等。在汇编程序手册中,你可以找到这些错误码的
10、解释,大约共有100条错误信息。注意:你必须再重新键入编辑程序,在编辑状态下更正源程序,然后再重新汇编,直至产生OBJ文件,才能进行下一步。,图4-3是已汇编过的列表文件,汇编程序以L41.LST名称将它存入磁盘。列表的顶端是堆栈段。SEGMENT、PROC、ASSUME以及END伪指令均不产生机器指令码。此列表不仅显示了源程序的符号指令码,同时把汇编后的机器码以十六进制格式显示在左边。最左边是序号,紧接着是堆栈段或数据段定义的数据或资料以及指令段指令的十六进制偏移地址。,堆栈段起始于0000处。当装入内存时,它依据SS寄存器的内容作为堆栈的起始地址,并从此位置计算起,其差距为0个字节处的位置
11、。SEGMENT伪指令中的PARA使得堆栈段定位在可以被16整除的地址。SEGMENT伪指令还通知汇编程序这是一个堆栈不产生机器指令码。DB伪指令也是对齐在地址0000处,含有12份“STACKSEG”字符串,其机器码是十六进制OC(十进制12)和ASCII码的十六进制表示法。稍后你可以利用DEBUG来观察存储器中的结果。堆栈段于地址Hex 0060处结束,即十进制96(128)。,指令段也起始于地址0000处。当装入内存时,它是依据CS寄存器的内容作为地址,并从此地址算起,其差距为0处。由于ASSUME是伪指令,所以第一个产生实际机器码的指令是PUSH DS,它是一条1字节长度的指令(1E)
12、,位于差距为0的位置(即偏移地址为0000)。次一条指令是SUB AX,AX,它是一条2个字节长度的指令(2B C0),放在指令段起始差距为0001的地址,即偏移地址为0001。在例4.1中机器指令的长度有1个字节、2个字节和3个字节。最后一条指令是END,它含有操作数BEGIN,与指令段地址0000的PROC名称有关。此地址就是装入程序后,开始执行程序的地址。,2.符号表 紧接在程序列表之后的是符号表。第一部分是一个段表,含有在程序中所有定义的段与段组(Groups),以及它们所占的字节长度、定位方法和组合形式。第二部分是一个符号表含有数据段内各数据栏的名称即变量名。例4.1中不存在此项。符
13、号表中还含有指令段内提供给指令使用的符号名和变量名,例4.1中只有一个BEGIN过程名。,3.两次扫描 汇编程序对源程序汇编时需要经过两次扫描。其原因之一是向前参考,就是指令可能参考到汇编程序尚未汇编到的标号。在第一次扫描时,汇编程序扫描整个源程序,并将程序所用到的名称与标号建立一个符号表,亦即数据段的变量名与指令段的标号名和过程名,以及它们在程序中的相对地址。第一次扫描决定了将要产生的机器码长度,但并不产生目的码。,在第二次扫描时,汇编程序使用第一次扫描所建立的符号表。目前它已知道每个数据栏的长度和指令的长度以及相对地址。所以,它能确定每一条指令所对应的目的码。之后,汇编程序可以依据命令需求
14、而产生OBJ、LST与CRF文件。,4.1.3 链接一个程序 OBJ文件几乎是可以执行的目标文件形式,但还不能直接执行。DOS的链接程序LINK.EXE就可生成可执行文件EXE,链接文件做下列工作。(1)对汇编程序在OBJ文件中留下的空白进行定址。你可以在稍后的LST文件所列出的目的码中看到如-R之类的内容,L41.LST文件所列出的目的码中没有此项。,(2)若有两个以上的汇编过的OBJ文件,要链接起来而成为一个可执行的文件(EXE)时,就需做结合的工作。例如,两个以上的汇编语言程序或一个汇编语言程序与一个用高级语言编写的程序(C或BASIC)进行结合。(3)利用适当的指令初始化EXE文件,以
15、便以后能正确装入内存并执行之。键入LINK L41并按下Enter键即可执行对L41的链接,接着系统会给出一连串的提示内容并等着你回答,如图4-4所示。,C:Link L41Run File L41.EXE:List File NUL.MAP:CONLibraries.LIB:,图4-4 LINK L41 执行过程,第一个提示要求你输入可执行文件名(使用与源文件相同的文件名即可)。第二个提示告诉你,LINK将默认为NUL.MAP(即不要MAP文件)。MAP文件含有各段的大小与名称表,以及LINK所发现的错误。一个典型的错误是堆栈段没有定义成功。CON回答告诉LINK在屏幕上显示此文件,而不存入
16、磁盘,这样可以节省磁盘空间,并允许你立即查看MAP文件。例4.1中,L41.MAP文件的内容如下所示:,起始地址 结束地址 长 度 名 称 类 型 00000H 0005FH 00060H STACKSG STACK 00060H 0006CH 0000DH CODESG CODE 第三个提示的回答是按下Enter键,它告诉LINK其余的选项均采用默认值。DOS手册中包含了对这些选项的说明。在这个过程中,唯一最可能出现的错误是输入了错误的文件名。解决方法是重新启动LINK再作一遍。,4.1.4 执行一个程序 当你把OBJ文件(一个或多个)进行链接,生成一个EXE文件后,就可以不限次数地执行这个
17、EXE文件了。但当你需要改变EXE文件时,就必须修改其源程序,然后再重新汇编生成另外一个OBJ文件,最后再重新链接此OBJ文件,重新生成EXE文件。经过汇编、链接过程后,生成可执行文件EXE,现在你就可以执行这个程序了。键入以下命令以执行此程序:C:L41.EXE或C:L41,DOS会将扩展名为EXE(或COM)的文件装入内存并执行。然而,此程序未编写显示功能,无法在屏幕上看到结果。例4.1程序的执行结果被存入内存单元,可以利用DEBUG程序的追踪命令(T)逐条执行指令,观察每一步骤的结果。有关DEBUG的用法请参阅第2章2.4节。,4.2 COM 文 件,程序经过汇编、链接都会产生EXE格式
18、的可执行文件。EXE文件在链接的过程中会自动地产生一个至少占有512个字节的文件头特殊记录格式,并被安置在磁盘文件(EXE)的开头位置。但你也可以产生一个可执行的COM文件。例如,COMMAND.COM就是一个最常用的COM文件。EXE2BIN.COM是一个DOS系统程序,它可以将EXE文件转换成COM文件。,4.2.1 EXE文件与COM文件的差异 虽然COM文件是利用EXE2BIN程序将EXE文件转换而成的,但是它们彼此之间仍存在着很大的差异,主要表现在下列几点。(1)程序大小。一个EXE文件可以为任意大小,然而一个COM文件被限制在一个段内,最大为64 K字节。COM文件总是比原来的EX
19、E文件小,其中一个原因是512个字节的文件头被放置在EXE文件的开始部分,但在COM磁盘文件中却没有。,(2)堆栈段。一个EXE文件需要自己定义堆栈段,然而系统会自动为COM文件产生堆栈段。因此,当你编写一个将被转换成COM文件的汇编文件时,可以省略定义堆栈段。(3)数据段。一个EXE文件通常会定义一个数据段(在需要时),并且将DS寄存器指向数据段的起始地址。COM文件只能在代码段中定义它的资料或数据。(4)初始化。EXE文件在刚开始时,要求堆栈段没有任何内容(是空的),并要求设定DS寄存器的初值。因为COM文件并没有堆栈段,也没有数据段,所以省略了这些步骤。,当COM文件初始化时,所有的段寄
20、存器都指向程序段的前缀PSP(Program Segment Prefix)的开始,PSP是一块占用256字节的内存区域。当COM与EXE被装入存储器时,DOS会自动地将PSP加在程序开始处的前面。由于程序真正的开始位置是相对于PSP起始位置的相对位移100H的地方,因此,在对代码段定义之后,COM文件应使用一条ORG 100H伪指令,设定程序的起始地址,以便使程序跳过PSP。接着使用一条JMP指令,跳到程序的真正开始处,如例4.2所示。,(5)转换。对于EXE及COM两种格式的程序,汇编、链接程序是没有区别的。汇编产生一个OBJ文件,然后链接该OBJ文件,产生一个EXE文件。如果原先是以EX
21、E文件格式,所编写的程序现在就可以执行。如果原先所编写的程序是COM格式,链接程序会产生一个提示信息:Warning:No STACK Segment,对于这个信息,可以忽略,因为它是假定必须定义堆栈段。利用EXE2BIN程序,再将EXE文件转换成COM文件。假如你有一个源程序是EXE的格式,你可以使用编辑软件修改一些指令,而使其成为COM文件的格式。,4.2.2 COM文件范例 例4.2 COM文件程序范例。该程序是将两个字单元FLDA、FLDB内容相加,结果存入FLDC单元中。这个程序有以下特点:(1)没有堆栈段和数据段。(2)ASSUME告诉汇编开始的相对地址,是从代码段的开始算起。CS
22、寄存器包含PSP的开始地址。用ORG伪指令跳过PSP,将程序指针指向指令段地址第100H个字节处。,(3)JMP指令转移执行程序的控制权,以便跳过数据定义部分。源程序清单如下:;filename:L42.ASM CODE SEGMENT ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ORG 100H;程序起始放在 PSP之后BEGIN:JMP MAIN;跳过数据区;,FLDA DW 250OH;定义数据 FLDB DW 125OH FLDC DW?;MAIN PROC NEAR MOV AX,FLDA;AX=0250 ADD AX,FLDB;Add 0125 t
23、o ax MOV FLDC,AX;Store sum in fldc RET;Return to dos,MAIN ENDP CODE ENDS END BEGIN,4.2.3 COM文件的堆栈 对于COM文件,DOS会自动地定义堆栈段,并且设定相同的段地址给四个段寄存器(CS、DS、ES、SS)。若64 K的地址范围足够存放你的程序,即你的程序长度比64 K小得多,DOS会将SP寄存器指向此段的结束位置,将其当作堆栈的顶点,其地址(即偏移地址)为FFFFH。假设64 K的地址范围,不足以提供足够的空间给堆栈使用,DOS将堆栈设在存储器结束的地方。对于上述两种情况,DOS都会将空字符放入堆栈中
24、。,若你的程序很大或者受存储器的限制,在堆栈中压入字内容时,你必须很小心地处理。使用时应当利用DIR命令或其他方法,以便了解一个文件的大小,它将帮助你了解堆栈的可使用空间。,4.3 汇编语言程序的编辑、汇编、链接与调试,这一节是对本章内容的练习,通过对汇编语言源程序的编辑、汇编与链接过程的练习与上机操作,可帮助你加深了解可执行文件EXE的初始化需求,掌握使程序正确返回DOS的方法。另外,还要练习如何将EXE文件转换成为COM文件以及COM文件对程序格式的需求。,练习中所使用的软件如下:(MS DOS环境下)(1)全屏幕编辑软件Edit。(2)宏汇编MASM。(3)TASM汇编。练习内容:(1)
25、显示HELLO字符十次,用RET返回DOS。(2)显示HELLO字符五次,用INT 21H返回DOS。(3)将EXE文件转换为COM文件。,4.3.1 练习一:显示HELLO十次1.程序清单;filename L43.ASM;DATA SEGMENT;定义数据段 MESG DB HELLO,0DH,0AH,$;定义字节型字符串0DH回车符、0AH换行符 DATA ENDS;定义数据段结束,;CODE SEGMENT;定义指令段 ASSUME CS:CODE,DS:DATA;指明段寄存器所对应的段 MAIN PROC FAR;定义过程或子程序PUSH DS;保存返回地址 MOV AX,0 PUS
26、H AX MOV AX,DATA;设置数据段初值,MOV DS,AX MOV CX,10;设置循环次数 LAST:MOV AH,09;DOS功能调用09AH MOV DX,OFFSET MESG;返回MESG的偏移地址 INT 21H;DOS功能调用 LOOP LAST;CX1 CX,CX0转LAST,RET;返回DOS MAIN ENDP;定义过程结束 CODE ENDS;定义指令段结束 END MAIN;源程序结束,说明:(1)该源程序含有两个段,数据段DATA与指令段CODE。(2)数据段定义了“HELLO”字符串,0DH回车符,0AH换行符。(3)MOV AH,09是将DOS功能调用号
27、09送AH。09号DOS功能调用的入口参数要求:09 AH,DS:DX指向字符串首地址,而且字符串必须以“$”结尾。(4)ASSUME伪指令,指明各段对应的寄存器;DS对应数据段,CS对应指令段。,(5)MAIN PROC FAR START:PUSH DS MOV AX,0 PUSH AX RET MAIN ENDPDOS将MAIN视为一个子程序调用,并用RET返回。,为数据段寄存器赋初值(6)MOV AX,DATA MOV DS,AX(7)MOV DX,OFFSET MESG 是09号DOS功能调用要求的,将MESG的地址返回给DX。(8)END MAIN:源程序结束。定义代码段(9)CO
28、DE SEGMENT CODE ENDS,定义代码段,(10)LOOP是一条循环指令,其操作首先执行CX-1CX,然后判断CX是否等于0,若CX0则转到LAST,若CX=0则执行LOOP的下一条指令。2操作步骤 第一步:用EDIT编辑汇编语言源程序文件,命名为L43.ASM。显示 操作,进入EDIT软件全屏幕编辑状态,按程序清单逐条输入源程序。第二步:存盘。在编辑状态下,输入完源程序之后,按ALT+F键下拉菜单出现,选择下拉菜单中的SAVE保存文件。注意,文件名的扩展名必须是.ASM,例如:L43.ASM。第三步:退出EDIT。存盘后按ALT+F键,选择下拉菜单中的EXIT即退出EDIT,返回
29、DOS状态。,第四步:对源程序进行汇编。显示 操作,汇编结束后会提示错误信息和出错的行号,请记录下出错的行号。从第一步开始,重新进入编辑状态,在编辑状态下改错。显示 操作,调出源程序修改错误,直到全部正确。重新存盘、汇编,汇编正确无误后会产生目标文件L43.OBJ;若有错误,则不会产生目标文件L43.OBJ。,第五步:链接目标文件。显示 操作,链接成功后会产生可执行文件L43.EXE。链接过程中除了操作时输入的命令符有可能出错,一般无错误。第六步:执行可执行文件L43.EXE。显示 操作,屏幕上显示十个HELLO字符串。练习一完成。,4.3.2 练习二:显示HELLO五次1.程序清单;file
30、name:L44.ASM;DATA SEGMENT MESG DB HELLO,0DH,0AH,$DATA ENDS;CODE SEGMENT ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA MOV DS,AX MOV CX,5 LAST:MOV AH,09 MOV DX,OFFSET MESG INT 21H LOOP LAST,MOV AH,4CH INT 21H MAIN ENDP CODE ENDS END START,说明:(1)练习一与练习二相同,均是用DOS功能调用INT 21H(功能号09)显示一个字符串。(2)不同的是练习二的程序没有以子程序
31、的方式编写;返回DOS的方法,使用DOS功能调用INT 21H,功能号为4CH。2操作步骤 第一步:编辑源程序文件。提示:练习二与练习一的程序仅返回DOS的方法不同,程序指令部分完全相同,若使用练习一的源程序文件进行修改会很方便。,显示 操作 进入编辑状态,更改文件名L43.ASM为L44.ASM。操作如下:按ALT+F键下拉菜单出现,选择SAVE-AS 将L43.ASM重新命名为L44.ASM。然后,按L44.ASM当前源程序修改并存盘、汇编,链接产生可执行文件L44.EXE,最后执行L44.EXE文件。方法参考练习一的第一步至第六步。,进入编辑状态,更改文件名L43.ASM为L44.ASM
32、。操作如下:按ALT+F键下拉菜单出现,选择SAVE-AS 将L43.ASM重新命名为L44.ASM。然后,按L44.ASM当前源程序修改并存盘、汇编,链接产生可执行文件L44.EXE,最后执行L44.EXE文件。方法参考练习一的第一步至第六步。,3用DEBUG调试该程序 可执行文件L44.EXE可以在DOS下直接执行,显示五个HELLO字符。也可以用DEBUG逐条追踪调试,方法如下。第一步:将L44.EXE装入内存。显示 操作,第二步:反汇编L44.EXE。注意:观察源程序清单中的各条可执行指令在装入内存中是如何表示的,对照源程序清单逐条阅读理解。显示 操作,显示:15A9:0000 B8A
33、815 MOV AX,15A8,15A9:0003 8ED8 MOV DS,AX15A9:0005 B90500 MOV CX,000515A9:0008 B409 MOV AH,0915A9:000A BA0000 MOV DX,000015A9:000D CD21 INT 21,说明:(1)15A9:0000表示EXE文件存放在指令段偏移地址0000处。(2)第1、2条指令确定数据段的段值,其位置在代码段的前面一小节位置处。例如:代码段地址为15A9:0000,而MOV AX,15A8指令中指出DS为15A8,它就是数据段的起始地址15A8:0000。(3)MOV DX,OFFSET ME
34、SG 会变为MOV DX,0000,符号地址MESG会变为实际偏移地址0000。,第三步:查看数据段内容。根据第一条指令MOV AX,15A8,可以确定数据段的起始地址是15A8:0000。(注意:应按你所使用的系统显示来确定。)显示 操作,显示:15A8:0000 48 45 4C 4C 4F 0D 0A 24-00 00 00 00 00 00 00 00 HELLO.$.可以观察到数据段存储的字符串“HELLO”与“$”。,第四步:单步追踪程序。注意:软中断指令INT 21H不能用T命令直接执行,当执行到INT 21H时应按下述方法操作,跳过INT 21H。显示 操作,这时屏幕会显示HE
35、LLO字符,下面仍可继续使用T命令执行。练习二完成。,4.3.3 练习三:COM文件的生成 COM文件不需要分数据段、指令段和堆栈段,数据、堆栈和指令全在一个段内;它们所占有的空间不允许超过64 K。因此,在编制较小的程序时很方便,装入速度比EXE文件要快,所占存储空间比EXE文件小。使用COM文件时,程序架构不需要分段,整个程序的入口地址必须是0100H(256),因为前256字节为程序段前缀所占用,不必设置堆栈段。在程序装入内存时,DOS会将SP寄存器指向此段的结束位置,当作堆栈的顶点,其值即偏移地址为FFFFH。,1.COM文件源程序架构;CODE SEGMENTASSUME CS:CO
36、DE,DS:CODE,SS:CODE(注意:CS、DS和SS均为为CODE)ORG 100HBEGIN:JMP SHORT MAIN;,数据区:DB DW;指令区 MAIN PROC MEARRETMAIN ENDPCODE ENDS END MAIN,2.程序清单;filename:L45.ASM CODE SEGMENT ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ORG 100H;程序起始放在 PSP之后BEGIN:JMP MAIN;跳过数据区;FLDA DW 2500H;定义数据 FLDB DW 1250H FLDC DW?,;MAIN PROC NE
37、AR MOV AX,FLDA;AX=2500H ADD AX,FLDB;ADD 1250H TO AX MOV FLDC,AX;STORE SUM IN FLDC RET;RETURN TO DOS MAIN ENDP CODE ENDS END BEGIN,3.操作步骤 第一步:用EDIT编辑文件将改写好的程序编辑存入磁盘,命名为L45.ASM。显示 操作,第二步:用TASM汇编程序将编辑好的L45.ASM文件进行汇编。,注意:为了方便得到COM文件,这里使用的是TASM汇编系统,它比前面所使用的MASM汇编系统功能强,使用时要带参数/zi,若想了解更详细的使用请参阅附录B。显示 操作,若汇
38、编没有发现错误,这时会产生目标文件L45.OBJ。第三步:用TLINK对目标文件L45.OBJ进行链接。注意:要带参数x/t 才能生成L45.COM文件,同时必须按COM格式编写程序。显示 操作,这时在当前磁盘目录下就生成了L45.COM文件。第四步:用TDEBUG将可执行文件L45.COM装入内存调试。显示 操作,TDEBUG指令代码显示调试区将显示:CS:0100 EB07 JMP 0109CS:0102 90 NOPCS:0103 0025 ADD DI,AHCS:0105 50 PUSH AXCS:0106 125037 ADC DL,BX+SI+37CS:0109 A10301 MOV AX,0103CS:010C 03060501 ADD AX,0105CS:0110 A30701 MOV 0107,AXCS:0113C3 RET,说明:(1)与本程序相关的指令地址为0100、01090113。(2)数据区的地址是01030108。第五步:用step单步执行并观察执行结果。练习完成。,