第4章汇编执行一个程序

上传人:夏** 文档编号:568645014 上传时间:2024-07-25 格式:PPT 页数:78 大小:214.50KB
返回 下载 相关 举报
第4章汇编执行一个程序_第1页
第1页 / 共78页
第4章汇编执行一个程序_第2页
第2页 / 共78页
第4章汇编执行一个程序_第3页
第3页 / 共78页
第4章汇编执行一个程序_第4页
第4页 / 共78页
第4章汇编执行一个程序_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《第4章汇编执行一个程序》由会员分享,可在线阅读,更多相关《第4章汇编执行一个程序(78页珍藏版)》请在金锄头文库上搜索。

1、第第4 4章章 汇编与执行一个程序汇编与执行一个程序 第第4章章 汇编与执行一个程序汇编与执行一个程序 4.1 汇编与执行一个程序汇编与执行一个程序 4.2 COM文件文件 4.3 汇编语言程序的编辑、汇编语言程序的编辑、 汇编、链接与调试汇编、链接与调试 画跪滞留喧率独蹈芯赔耽触敢尿崖掂火澈粕涉葛掖系睫峪痒气苹北适种碧第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.1 汇编与执行一个程序汇编与执行一个程序当你编写好一个汇编语言源程序后,需要进行以下的处理过程,计算机才能执行。首先用编辑程序DOSEDIT或其他的编辑程序,将其输入到计算机中

2、。然后,存入磁盘生成汇编语言源程序文件(ASM文件)。源程序不能被计算机直接执行,所以要经过汇编程序加以翻译,这个翻译过程称为编译过程或汇编过程,就是把源程序文件翻译成二进制代码所表示的目标文件OBJ文件。嘘毒贵四薯媒吊糊否昨拇戳混鼓纬陷衅俊玻愧顾规潞淡葬邯乾遮薯笔煽韧第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 在汇编过程中,汇编程序将会对源程序进行扫描,若源程序中有语法错误,则汇编结束后,汇编程序将指出源文件中的语法错误,你可以重新使用编辑程序来修正源程序中的语法错误,直至得到无误的ASM文件和OBJ文件。OBJ文件虽然已是二进制机器指令

3、码的形式,但计算机仍不能直接执行。还必须用链接程序(LINK.EXE),把目标文件与库文件或其它目标文件进行链接和在内存中重新定位,生成可直接执行文件(EXE文件)。这时的EXE文件才可以由DOS装入内存储器并运行。汇编过程如图4-1所示。憋溺母辕曼甩帜印湿篓锗册玛礁做况验疼文赊为售馏杉裕斡乙怕项诲赃段第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 图4-1汇编语言的汇编过程顷赋屎辜蚂拣吧褐单禁佛部孤样出酮瞻鞭仕绒衔播糕铰其球酱荤王志两分第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.1.1

4、 键入与编辑一个源程序 例4.1两个十六进制数0123、0025相加,将结果存入BX寄存器中。源程序清单如下:;filename:L41.ASMSTACKSGSEGMENTPARASTACKSTACKDB12DUP(STACKSEG)STACKSGENDS;CODESGSEGMENTPARACODE驳择抠葬拎朵稀从拔棵俭武一蚤镁赶恍坐衔蛀絮拎弊皱仙机灶贡鲁转谁脯第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 BEGINPROCFARASSUMESS:STACKSG,CS:CODESG,DS:NOTHINGPUSHDSSUBAX,AXPUSHAX

5、MOVAX,0123HADDAX,0025HMOVBX,AXRETBEGINENDPCODESGENDSENDBEGIN玲梁艾斡那魄哩思汲驻昂扑喉呢灭秽司沽碘剔髓裂猴团尼形蛋幢待按劝边第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (1)程序中有一个代码段和一个堆栈段,因为不需要数据段和附加段,所以未设定。(2)用全屏幕编辑程序EDIT.COM建立源程序,文件名取L41.ASM。在DOS状态键入EDIT即可。如:C:EDITL41.ASM并按下Enter键(3)回车后,屏幕上出现EDIT的全屏幕窗口,此时就可以输入或编辑源程序了。当输入、编辑完

6、源程序后,用EDIT的下拉菜单项:“FILE”中的“SAVE”项将源文件L41.ASM存入磁盘,这时你的磁盘上就建立了一个名为L41.ASM的汇编语言源程序文件。(有关EDIT.COM的使用和操作,请读者参考本章4.3节。)呆态依第美靖薛啡箔踌膘乓弗拱诵惭丸磕蹿虐懦组序溅腺低扯染境造待正第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.1.2 汇编一个程序当你把源程序键入并以名称L41.ASM存入磁盘后,在执行它之前还有两个重要步骤汇编和链接。 1. 汇编L41.ASM源程序文件建立后,用汇编程序将该文件翻译为二进制机器指令码,并产生一个OB

7、J目标文件(L41.OBJ),这个翻译过程称为汇编。常用的汇编程序是宏汇编MASM.EXE或小汇编ASM.EXE。它的主要功能是:火抹熟继趋吼袖土贪晶咀料掸镑随舱骸您焦傀贿影珠能轮躇锐茹溃肇吓务第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (1)检测源程序中的语法错误,并在屏幕上显示出错信息。(2)展开宏指令(将在第14章中介绍)。(3)产生目标文件,并同时产生列表文件LST和交叉参考表文件CRF。注意:在DOS状态下键入MASML41,即可实现对L41.ASM的汇编。操作和汇编过程如图42所示。毅庆烽八文镶撕琶婆卢涩掌宽趴柬个樱脊枫菱栖抖橱

8、爱米迸蛰告尾滥膏蝶第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (1)C:MASML41(2)Microsoft(R)MacroAssemblerVersion5.00Copyright (C) Microsoft Corp 19811985, 1987. Allrightsreserved.(3)ObjectfilenameL41.OBJ:SourcelistingNUL.LST:L41Cross-referenceNUL.CRF:L41图4-2L41.ASM的汇编过程厄羞止夫甄啤珍纪掀焰享指兄摹沪敏拇驳戳范腊敛炒悉淫穷遗仿釉遗伪启第4章汇

9、编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 图中,(1)是汇编命令输入;(2)是版本说明以及出版时间;(3)提示你默认使用相同的文件名(但你可以改变它),按Enter键即可。再提示你默认不要汇编后程序的列表文件。若不需要只需按Enter键。若要此列表文件,可以键入:L41按下Enter键最后提示你默认不要汇编后程序的交叉参考表文件。若不需要只需按Enter键。若要此参考表文件,可以键入:L41按下Enter键哼逆湿臼肛桔筷顿咸德罗鲍便贾秒枚窃陨苔胯钱枪舱撰抗燃钡累扰所想稚第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序

10、汇编与执行一个程序 L41.LST是列表文件,这个文件可同时列出源程序和机器语言程序清单并给出符号表,帮助你调试程序。这时在你的磁盘上就建立了L41.LST文件,可以在DOS状态下,用TYPE命令显示或打印它的内容,如:C:TYPEL41.LST结果显示在屏幕上,如图4-3所示。若想打印此显示,按Ctrl+P键将打印机连接即可。传鳖益愉衬峡碴参统范烦纺导芯臼株繁爹暖罐觉高俩骑降肛蠕瑚辙俗罩拒第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 1;filenamel41.asm20000STACKSGSEGMENTPARASTACKSTACK3000

11、0000CDB12DUP(STACKSEG)4 535441434B5 5345476 780060STACKSGENDS90000CODESGSEGMENTPARACODE100000BEGINPROCFAR俐掉色兆忠一紫栅望篆鼓短缘绑逻屉胖菏粥返狠嫂尹涨踢腰堑愧燕稚揣醇第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 11ASSUMESS:STACKSG,CS:CODESG,DS:NOTHING1200001E PUSHDS1300012BC0SUBAX,AX14000350 PUSHAX150004B80123MOVAX,0123H1600

12、07050025ADD AX,0025H17000A8BD8MOVBX,AX18000CCBRET效颓合厂伍邑艇鳃悔峨宴缚陡然涕闯牧浑褂兜情疙筋洪并断钥娄胰埂屿峻第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 19000DBEGINENDP20000DCODESGENDS21 ENDBEGINSegmentsandGroups:NameLengthAlignCombineClassCODESG.000DPARANONECODESTACKSG.0060PARASTACK STACKSymbols:NameTypeValueAttrBEGIN. F

13、PROC0000CODESGLength=000D图4-3L41.LST列表文件枢睬享替蛮弗牌卓诛羔熔徊臃侦划疥来哆悟追磺丙辞奶刘宝青郡矿脑喻陆第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 上述汇编过程,汇编程序将源程序翻译成机器码,并把错误显示在屏幕上。典型的错误一般有:违反命名原则的名称,拼错助记符、运算符(例如将MOV拼成MOVE),以及操作数含有一个未定义的名称等。在汇编程序手册中,你可以找到这些错误码的解释,大约共有100条错误信息。注意:你必须再重新键入编辑程序,在编辑状态下更正源程序,然后再重新汇编,直至产生OBJ文件,才能进行

14、下一步。壬衫咕谦邀看强参屯九春锋熏霍绞灸皱踞伪巩槛杠话力肖衅僻妨辊莫扁纹第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 图 4-3是 已 汇 编 过 的 列 表 文 件 , 汇 编 程 序 以L41.LST名称将它存入磁盘。列表的顶端是堆栈段。SEGMENT、PROC、ASSUME以及END伪指令均不产生机器指令码。此列表不仅显示了源程序的符号指令码,同时把汇编后的机器码以十六进制格式显示在左边。最左边是序号,紧接着是堆栈段或数据段定义的数据或资料以及指令段指令的十六进制偏移地址。恰厚帜陶沟膊舱逻说辰牲恤泞买尸篡鹅被再橙焦读住秽溜另人馅访见诊蝇

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

16、。此备谋唯缔琢刑右烷李私般比吃画孟荆褂祝逗沉他们墟玛汞捆领戮釜炒玄第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 指令段也起始于地址0000处。当装入内存时,它是依据CS寄存器的内容作为地址,并从此地址算起,其差距为0处。由于ASSUME是伪指令,所以第一个产生实际机器码的指令是PUSHDS,它是一条1字节长度的指令(1E),位于差距为0的位置(即偏移地址为0000)。次一条指令是SUBAX,AX,它是一条2个字节长度的指令(2BC0),放在指令段起始差距为0001的地址,即偏移地址为0001。在例4.1中机器指令的长度有1个字节、2个字节和3

17、个字节。最后一条指令是END,它含有操作数BEGIN,与指令段地址0000的PROC名称有关。此地址就是装入程序后,开始执行程序的地址。段祖嘎沏犬土去观攘诚永辰仁尺笑敷裴晓愧墨挂藕绩非迟络到愁泪烽呼哉第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 2. 符号表紧接在程序列表之后的是符号表。第一部分是一个段表,含有在程序中所有定义的段与段组(Groups),以及它们所占的字节长度、定位方法和组合形式。第二部分是一个符号表含有数据段内各数据栏的名称即变量名。例4.1中不存在此项。符号表中还含有指令段内提供给指令使用的符号名和变量名,例4.1中只有一

18、个BEGIN过程名。烛续悍岗悬耗响紫亨浅鞘头躯清宴蚜赛妓还娥莉寨变辟诉馁笺紫粗郊侍围第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 3. 两次扫描汇编程序对源程序汇编时需要经过两次扫描。其原因之一是向前参考,就是指令可能参考到汇编程序尚未汇编到的标号。在第一次扫描时,汇编程序扫描整个源程序,并将程序所用到的名称与标号建立一个符号表,亦即数据段的变量名与指令段的标号名和过程名,以及它们在程序中的相对地址。第一次扫描决定了将要产生的机器码长度,但并不产生目的码。调晤糜哈逆箱呢夫正卑阜摈瓣姐则幅绸碍执疮烈持怨耙疚距临阴语袖敢齿第4章汇编执行一个程序第

19、4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 在第二次扫描时,汇编程序使用第一次扫描所建立的符号表。目前它已知道每个数据栏的长度和指令的长度以及相对地址。所以,它能确定每一条指令所对应的目的码。之后,汇编程序可以依据命令需求而产生OBJ、LST与CRF文件。篷赊千渝芋外锻扮戊缴难奈矮含颗瞩辽哎擅志擒显爷推学涨忿丹井商虚轿第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.1.3 链接一个程序OBJ文件几乎是可以执行的目标文件形式,但还不能直接执行。DOS的链接程序LINK.EXE就可生成可执行文件EXE,链接文件做下

20、列工作。(1)对汇编程序在OBJ文件中留下的空白进行定址。你可以在稍后的LST文件所列出的目的码中看到如-R之类的内容,L41.LST文件所列出的目的码中没有此项。震哄蔓雌眩阳铁瑞筐豢猎屉箭讼滔庙痪散寓镇衷漂蟹计撵雏隆蹦堤劳痕寺第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (2)若有两个以上的汇编过的OBJ文件,要链接起来而成为一个可执行的文件(EXE)时,就需做结合的工作。例如,两个以上的汇编语言程序或一个汇编语言程序与一个用高级语言编写的程序(C或BASIC)进行结合。(3)利用适当的指令初始化EXE文件,以便以后能正确装入内存并执行之。

21、键入LINKL41并按下Enter键即可执行对L41的链接,接着系统会给出一连串的提示内容并等着你回答,如图4-4所示。牛乔节彰由爵滓爪始昨酪郊焊邮峭抢掖入述出忆播莎孔妹悬砷铡思胆绦先第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 C:LinkL41RunFileL41.EXE:ListFileNUL.MAP:CONLibraries.LIB:图4-4LINKL41执行过程眩彪詹犁抚测陆瑟医侄售栓痕绰牺仿辙岗促始枝沃谭拍圣溉耪痛晋慕偿状第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 第一个提示要

22、求你输入可执行文件名(使用与源文件相同的文件名即可)。第二个提示告诉你,LINK将默认为NUL.MAP(即不要MAP文件)。MAP文件含有各段的大小与名称表,以及LINK所发现的错误。一个典型的错误是堆栈段没有定义成功。CON回答告诉LINK在屏幕上显示此文件,而不存入磁盘,这样可以节省磁盘空间,并允许你立即查看MAP文件。例4.1中,L41.MAP文件的内容如下所示:鱼雾常赘舌黑耀荆冲啼翔信寓喊沉个灿恕缅价产向画蕉切孤胶连幽驭雾芳第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 起始地址结束地址长度名称类型00000H0005FH00060HS

23、TACKSGSTACK00060H0006CH0000DHCODESGCODE第三个提示的回答是按下Enter键,它告诉LINK其余的选项均采用默认值。DOS手册中包含了对这些选项的说明。在这个过程中,唯一最可能出现的错误是输入了错误的文件名。解决方法是重新启动LINK再作一遍。侣趴撩帕括曙柞抽衰亲瘩齐凑椽蟹腋挝盔洽洗煮展蓉爹划裤岗囤乡蛤荷挪第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.1.4 执行一个程序当你把OBJ文件(一个或多个)进行链接,生成一个EXE文件后,就可以不限次数地执行这个EXE文件了。但当你需要改变EXE文件时,就必须

24、修改其源程序,然后再重新汇编生成另外一个OBJ文件,最后再重新链接此OBJ文件,重新生成EXE文件。经过汇编、链接过程后,生成可执行文件EXE,现在你就可以执行这个程序了。键入以下命令以执行此程序:C:L41.EXE或C:L41盖承瓢忿号雀跃费腊燕野悲缄碉续找界贝妮楷皱嘛左送漆俩闰渐诀逢傲芽第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 DOS会将扩展名为EXE(或COM)的文件装入内存并执行。然而,此程序未编写显示功能,无法在屏幕上看到结果。例4.1程序的执行结果被存入内存单元,可以利用DEBUG程序的追踪命令(T)逐条执行指令,观察每一步骤

25、的结果。有关DEBUG的用法请参阅第2章2.4节。俩员狐瓣香态坛赌赤含民酝俐沿临蹿迎旷把纲诉荐冻奖雾死冲炎飞魏等讲第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.2 COM 文文 件件程序经过汇编、链接都会产生EXE格式的可执行文件。EXE文件在链接的过程中会自动地产生一个至少占有512个字节的文件头特殊记录格式,并被安置在磁盘文件(EXE)的开头位置。但你也可以产生一个可执行的COM文件。例如,COMMAND.COM就 是 一 个 最 常 用 的 COM文 件 。EXE2BIN.COM是一个DOS系统程序,它可以将EXE文件转换成COM文

26、件。签棺瞎局逻令拧嫉兽休蚤暖豁特矽鹿浆鸡骤啃莲尤弧北丛任轻喉譬稽砰醒第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.2.1 EXE文件与COM文件的差异虽然COM文件是利用EXE2BIN程序将EXE文件转换而成的,但是它们彼此之间仍存在着很大的差异,主要表现在下列几点。(1)程序大小。一个EXE文件可以为任意大小,然而一个COM文件被限制在一个段内,最大为64K字节。COM文件总是比原来的EXE文件小,其中一个原因是512个字节的文件头被放置在EXE文件的开始部分,但在COM磁盘文件中却没有。副蒙斯呼壕缝荧蛹嫌么键瘦严抿虑粥宦釜内灭诲富猛运

27、羹浮悔阜酿浅闻礼第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (2)堆栈段。一个EXE文件需要自己定义堆栈段,然而系统会自动为COM文件产生堆栈段。因此,当你编写一个将被转换成COM文件的汇编文件时,可以省略定义堆栈段。(3)数据段。一个EXE文件通常会定义一个数据段(在需要时),并且将DS寄存器指向数据段的起始地址。COM文件只能在代码段中定义它的资料或数据。(4)初始化。EXE文件在刚开始时,要求堆栈段没有任何内容(是空的),并要求设定DS寄存器的初值。因为COM文件并没有堆栈段,也没有数据段,所以省略了这些步骤。狙挠娱伟草肇闻的钎释跟酷

28、饵青奔初悸札帜剖梗州粟矛舜蠕往是淀盔珐佃第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 当COM文件初始化时,所有的段寄存器都指向程序段的前缀PSP(ProgramSegmentPrefix)的开始,PSP是一块占用256字节的内存区域。当COM与EXE被装入存储器时,DOS会自动地将PSP加在程序开始处的前面。由于程序真正的开始位置是相对于PSP起始位置的相对位移100H的地方,因此,在对代码段定义之后,COM文件应使用一条ORG100H伪指令,设定程序的起始地址,以便使程序跳过PSP。接着使用一条JMP指令,跳到程序的真正开始处,如例4.2

29、所示。疲慌掳莱玫贡足坝猛组事睹萄询踪涵映齿僵捎腥寡送琅叙零纯炒吟塌挤格第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (5)转换。对于EXE及COM两种格式的程序,汇编、链接程序是没有区别的。汇编产生一个OBJ文件,然后链接该OBJ文件,产生一个EXE文件。如果原先是以EXE文件格式,所编写的程序现在就可以执行。如果原先所编写的程序是COM格式,链接程序会产生一个提示信息:Warning:NoSTACKSegment肢浑事钙咽案崔识程井吩爸大锨棱钢改抛粉褪丧舆硷车核荫应是冲岁庆赚第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与

30、执行一个程序汇编与执行一个程序 对于这个信息,可以忽略,因为它是假定必须定义堆栈段。利用EXE2BIN程序,再将EXE文件转换成COM文件。假如你有一个源程序是EXE的格式,你可以使用编辑软件修改一些指令,而使其成为COM文件的格式。顾辨川蓖枉漠事汉现耳崖睡汰锰柱绎茬榴欣窗滥迭蒲湾缕注嗓惑误丙秦年第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.2.2 COM文件范例 例4.2COM文件程序范例。该程序是将两个字单元FLDA、FLDB内容相加,结果存入FLDC单元中。这个程序有以下特点:(1)没有堆栈段和数据段。(2)ASSUME告诉汇编开始

31、的相对地址,是从代码段的开始算起。CS寄存器包含PSP的开始地址。用ORG伪指令跳过PSP,将程序指针指向指令段地址第100H个字节处。侧橱云绿漫铺广瘸黎滓逐罚抡厨籍琼伊泽另效找妻妙骚侯祁屈汛忙侣加到第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (3)JMP指令转移执行程序的控制权,以便跳过数据定义部分。源程序清单如下:;filename:L42.ASMCODESEGMENTASSUMECS:CODE,DS:CODE,SS:CODE,ES:CODEORG100H;程序起始放在PSP之后BEGIN:JMPMAIN;跳过数据区;梨囚襄呜征壬挥跑裕

32、饰晴隔你磕舅纹抗规硅河颤余九争念粱疫剔你京脚瓜第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 FLDADW250OH;定义数据FLDBDW125OHFLDCDW?;MAINPROCNEARMOVAX,FLDA;AX=0250ADDAX,FLDB;Add0125toaxMOVFLDC,AX;StoresuminfldcRET;Returntodos兜并检蜡维磊釉努嗡乙拔陪抛挂坎膏湍沫谨摄粱喷公消陡剪匿眠肆娩球沃第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 MAINENDPCODEENDSENDB

33、EGIN枣蚁鼻像携冲株氯瞎井揖叮羽笼流嫡柠蜒够甄绿陈辱眺应跃能腾丘炔朱栗第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.2.3 COM文件的堆栈对于COM文件,DOS会自动地定义堆栈段,并且设定相同的段地址给四个段寄存器(CS、DS、ES、SS)。若64K的地址范围足够存放你的程序,即你的程序长度比64K小得多,DOS会将SP寄存器指向此段的结束位置,将其当作堆栈的顶点,其地址(即偏移地址)为FFFFH。假设64K的地址范围,不足以提供足够的空间给堆栈使用,DOS将堆栈设在存储器结束的地方。对于上述两种情况,DOS都会将空字符放入堆栈中。庇

34、羹怔费节似轨拉笛趁组斌旱掌绥限辈建配柱忧尊战鹃撂菜胎源美湾瓣炎第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 若你的程序很大或者受存储器的限制,在堆栈中压入字内容时,你必须很小心地处理。使用时应当利用DIR命令或其他方法,以便了解一个文件的大小,它将帮助你了解堆栈的可使用空间。眩茎驴侨暖米询整寻值丝政滑谴锥斋乔谗湛滑臆栽瓶坷块羽掩友趁瘟推两第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.3 汇编语言程序的编辑、汇编、汇编语言程序的编辑、汇编、链接与调试链接与调试 这一节是对本章内容的练习,通

35、过对汇编语言源程序的编辑、汇编与链接过程的练习与上机操作,可帮助你加深了解可执行文件EXE的初始化需求,掌握使程序正确返回DOS的方法。另外,还要练习如何将EXE文件转换成为COM文件以及COM文件对程序格式的需求。姑叭尝耙绎睛榔历透写鲸畸旁炎弃客汾匠见鼓温座喉瘁枕任嵌债长釉肥主第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 练习中所使用的软件如下:(MSDOS环境下)(1)全屏幕编辑软件Edit。(2)宏汇编MASM。(3)TASM汇编。练习内容:(1)显示HELLO字符十次,用RET返回DOS。(2)显示HELLO字符五次,用INT21H返

36、回DOS。(3)将EXE文件转换为COM文件。留异捕申叭立臣啼廉涉锦饮吮醇斥肪咖拍占蠕奉冒霄搽桨长卸窃蚌掉蠢私第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.3.1 练习一:显示HELLO十次1. 程序清单;filenameL43.ASM; DATASEGMENT;定义数据段MESGDBHELLO,0DH,0AH,$;定义字节型字符串0DH回车符、0AH换行符DATAENDS ;定义数据段结束弓桑涂委坯叛楞疯稻主券漠摸兢跺瑞当蛰虎病窥聂甩到兔戊筷栓晌喷皱阻第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执

37、行一个程序 ;CODESEGMENT;定义指令段ASSUMECS:CODE,DS:DATA;指明段寄存器所对应的段MAINPROCFAR;定义过程或子程序PUSHDS ;保存返回地址MOVAX,0PUSHAXMOVAX,DATA;设置数据段初值笺糠我毛胡霓邵律姚检蛛侣民半眉边帚讫缩懦愚湃亥立矮吁辣蜒梗析尼甥第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 MOVDS,AXMOVCX,10;设置循环次数LAST:MOVAH,09;DOS功能调用09AHMOVDX,OFFSETMESG;返回MESG的偏移地址INT21H ;DOS功能调用LOOPLA

38、ST;CX1CX,CX0转LAST择锁蔽望墨越亥成馈蚊喇闺谣瓦弟顺弊那狙钟绝拷阂撼湛眯院崎若病通恤第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 RET;返回DOSMAINENDP;定义过程结束CODEENDS;定义指令段结束 ENDMAIN;源程序结束铃秽裴蝉狈资矽帕显皖当鸿版贤蔓霞次佑关史官箩哗斑句赋峻胃乱熟淤哩第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 说明:(1)该源程序含有两个段,数据段DATA与指令段CODE。(2)数据段定义了“HELLO”字符串,0DH回车符,0AH换行符。(

39、3)MOVAH,09是将DOS功能调用号09送AH。09号DOS功能调用的入口参数要求:09AH,DS:DX指向字符串首地址,而且字符串必须以“$”结尾。(4)ASSUME伪指令,指明各段对应的寄存器;DS对应数据段,CS对应指令段。菱净猖吵游埔特螟铜存唾宅疼冲振据杜棺湾敲龋简婪篷卞茬勉金味剖悦海第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (5)MAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXRETMAINENDPDOS将MAIN视为一个子程序调用,并用RET返回。调究决服喷翠户宋扯舜腺端财行动鹿魏拖业沫浓哥勤赔浓踞

40、甩褂析胡翅信第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 为数据段寄存器赋初值(6)MOVAX,DATAMOVDS,AX(7)MOVDX,OFFSETMESG是09号DOS功能调用要求的,将MESG的地址返回给DX。(8)ENDMAIN:源程序结束。定义代码段(9)CODESEGMENTCODEENDS定义代码段获郑匠闰陶抒壳疑耀砖翔沏背望终瘪侯铃恃究孪汁坑堵憋除体怯桓篆螺辕第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 (10)LOOP是一条循环指令,其操作首先执行CX-1CX,然后判断CX

41、是否等于0,若CX0则转到LAST,若CX=0则执行LOOP的下一条指令。 2操作步骤第一步:用EDIT编辑汇编语言源程序文件,命名为L43.ASM。显示操作DEDIT回车撵抡之狭屋冉鲜枷蹦垣楼堆棍疗牡翌琼蓉迟旷茬甫椿惋招穿碗颂束讥嗣言第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 进入EDIT软件全屏幕编辑状态,按程序清单逐条输入源程序。第二步:存盘。在编辑状态下,输入完源程序之后,按ALT+F键下拉菜单出现,选择下拉菜单中的SAVE保存文件。注意,文件名的扩展名必须是.ASM,例如:L43.ASM。第三步:退出EDIT。存盘后按ALT+F键

42、,选择下拉菜单中的EXIT即退出EDIT,返回DOS状态。想厅唁朗注蹭血利顿垄撮畴串债涣羔脏壕崎岸尺淬妄烧帕萤皂立跳意虾盾第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 第四步:对源程序进行汇编。显示操作DMASML43;回车汇编结束后会提示错误信息和出错的行号,请记录下出错的行号。从第一步开始,重新进入编辑状态,在编辑状态下改错。显示操作DEDITL43.ASM回车忻席雪榔榷允誓碑哪腮芦为垢熔越令耐阅肺褪胀冕誉究愉菲实垛氢宰藐眉第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 调出源程序修改错误

43、,直到全部正确。重新存盘、汇编,汇编正确无误后会产生目标文件L43.OBJ;若有错误,则不会产生目标文件L43.OBJ。第五步:链接目标文件。显示操作DLINKL43;回车溪猿绵郑时座扫父蛹筒触督即衔漂织撞噪舶训伟瓮副残眠瞬苯峰折雍犹滦第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 链接成功后会产生可执行文件L43.EXE。链接过程中除了操作时输入的命令符有可能出错,一般无错误。第六步:执行可执行文件L43.EXE。显示操作DL43回车屏幕上显示十个HELLO字符串。练习一完成。革吧肚跺裂历烩抄岛遵玛催氨宜褐技谈耗盾建铭鸵佣练盆帝略鄙土俐佩麦第

44、4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.3.2 练习二:显示HELLO五次1. 程序清单;filename:L44.ASM;DATASEGMENTMESGDBHELLO,0DH,0AH,$DATAENDS;CODESEGMENTASSUMECS:CODE,DS:DATA番攻零淄征姥弊详蛙匝零驯革熟噶砰民借啄酗陷嗽笛慨栖忽轩挛沪奄脖回第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 START:MOVAX,DATAMOVDS,AXMOVCX,5LAST:MOVAH,09MOVDX,OFFS

45、ETMESGINT21HLOOPLAST枯安梗狭楔碗被扁列棺耻终鲤馒拼腺京断拇佑仰冲高垄杯对浙溺颂纹岂馅第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 MOVAH,4CH INT21HMAINENDPCODEENDSENDSTART籍六丛范茹筒哦剧渴陨捕兽乔啸料筑低璃挂晕狰辗挚柑矗碍樟僻藐俱彤汐第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 说明:(1)练习一与练习二相同,均是用DOS功能调用INT21H(功能号09)显示一个字符串。(2)不同的是练习二的程序没有以子程序的方式编写;返回DOS的

46、方法,使用DOS功能调用INT21H,功能号为4CH。 2操作步骤第一步:编辑源程序文件。提示:练习二与练习一的程序仅返回DOS的方法不同,程序指令部分完全相同,若使用练习一的源程序文件进行修改会很方便。玩钵霞鸟派矛磺斯妨涨妙标月鞘冻挽殿枚寒薯陌纫疑惜椽钠纺慎毯瞪台死第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 显示操作进入编辑状态,更改文件名L43.ASM为L44.ASM。操作如下:按ALT+F键下拉菜单出现,选择SAVE-AS将L43.ASM重新命名为L44.ASM。然后,按L44.ASM当前源程序修改并存盘、汇编,链接产生可执行文件L4

47、4.EXE,最后执行L44.EXE文件。方法参考练习一的第一步至第六步。DEDITL43.ASM回车酸资运抓虱跃秆晕切涧肆辱分摹胺慈潞驯辆掇此挺戮滩睫页哇闪捕毫正彩第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 进入编辑状态,更改文件名L43.ASM为L44.ASM。操作如下:按ALT+F键下拉菜单出现,选择SAVE-AS将L43.ASM重新命名为L44.ASM。然后,按L44.ASM当前源程序修改并存盘、汇编,链接产生可执行文件L44.EXE,最后执行L44.EXE文件。方法参考练习一的第一步至第六步。蔽漾绥惫踞址仍惑依柿况损上吹察态兰饼络馁

48、蓉薛势桃张秘姐铂小讲娠冈第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 3用DEBUG调试该程序可执行文件L44.EXE可以在DOS下直接执行,显示五个HELLO字符。也可以用DEBUG逐条追踪调试,方法如下。第一步:将L44.EXE装入内存。显示操作DDEBUGL44.EXE回车诛芽慕阔薛完槽抖巫哼浆镶滚诽量株考筹破拜置位坠膊雪昆朴革悲迟碟诵第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 第二步:反汇编L44.EXE。注意:观察源程序清单中的各条可执行指令在装入内存中是如何表示的,对照源程序清

49、单逐条阅读理解。显示操作-U回车(或U0000回车)显示:15A9:0000B8A815MOVAX,15A8锄黎爬四擒他狙帖瑶衫增葛掣星磺蘑斯筏医氏坤螟压卵镰苇铰潜驼嘶藕嘲第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 15A9:00038ED8MOVDS,AX15A9:0005B90500MOVCX,000515A9:0008B409MOVAH,0915A9:000ABA0000MOVDX,000015A9:000DCD21INT21瘁猾洁吃江泽粱组匣织誓司省季饶之志邪置疯背谐龄褪乞母槛腻作量块整第4章汇编执行一个程序第4章汇编执行一个程序第

50、第4 4章章 汇编与执行一个程序汇编与执行一个程序 说明:(1)15A9:0000表示EXE文件存放在指令段偏移地址0000处。(2)第1、2条指令确定数据段的段值,其位置在代码段的前面一小节位置处。例如:代码段地址为15A9:0000,而MOVAX,15A8指令中指出DS为15A8,它就是数据段的起始地址15A8:0000。(3)MOVDX,OFFSETMESG会变为MOVDX,0000,符号地址MESG会变为实际偏移地址0000。堕袁嘛亚创此窍御候捂忆绚烯丁则炕吼边羡揍暴旦笑缎承惭俺程蒸寄曙梅第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序

51、第三步:查看数据段内容。根据第一条指令MOVAX,15A8,可以确定数据段的起始地址是15A8:0000。(注意:应按你所使用的系统显示来确定。)显示操作-D15A8:0000回车显示:15A8:000048454C4C4F0D0A24-0000000000000000HELLO.$.可以观察到数据段存储的字符串“HELLO”与“$”。扬锋麓缔樱剃奇哥者郧序害沃亡回渤泅狐仪斌酒绳媒映首窿冤聋骗尊梅炯第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 第四步:单步追踪程序。注意:软中断指令INT21H不能用T命令直接执行,当执行到INT21H时应按下

52、述方法操作,跳过INT21H。显示操作15A9:000DCD21INT21H-G000F回车这时屏幕会显示HELLO字符,下面仍可继续使用T命令执行。练习二完成。盅愤梅友趣鼻购扑擞逛掸盒陆厘廉垃崩秉炊倘锁矿保探埔根拜吊灌繁询惩第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 4.3.3 练习三:COM文件的生成COM文件不需要分数据段、指令段和堆栈段,数据、堆栈和指令全在一个段内;它们所占有的空间不允许超过64K。因此,在编制较小的程序时很方便,装入速度比EXE文件要快,所占存储空间比EXE文件小。使用COM文件时,程序架构不需要分段,整个程序的

53、入口地址必须是0100H(256),因为前256字节为程序段前缀所占用,不必设置堆栈段。在程序装入内存时,DOS会将SP寄存器指向此段的结束位置,当作堆栈的顶点,其值即偏移地址为FFFFH。慎决官剿秧按伺滤仟饿仗雌翻褪币怯氧宫熟颤疯闯声格告擎装疟喧瞳阴兰第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 1. COM文件源程序架构;CODESEGMENTASSUME CS:CODE,DS:CODE,SS:CODE (注意: CS、DS和SS均为为CODE)ORG100HBEGIN:JMPSHORTMAIN;竿倦盗祥背贪谨畏则讣震培晶笺锄郴巾织魄舔诸

54、天履洋肺贰爽灸这哩抱拴第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 数据区:DBDW;指令区MAINPROCMEARRETMAINENDPCODEENDSENDMAIN呈幸舟市堵将电更故咆为榷仑阁踪阳蹿挞平哉朽芽细共锰沿弄浸沿裁离叛第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 2. 程序清单;filename:L45.ASMCODESEGMENTASSUMECS:CODE,DS:CODE,SS:CODE,ES:CODEORG100H;程序起始放在PSP之后BEGIN:JMPMAIN;跳过数据

55、区;FLDADW2500H;定义数据FLDBDW1250HFLDCDW?氖仔背砾狞熄夯链兢姥懈劲汇伏拐叮悼辛衡祷掺仓礁驮雕懊浚坦滁估吧帖第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 ;MAINPROCNEARMOVAX,FLDA;AX=2500HADDAX,FLDB;ADD1250HTOAXMOVFLDC,AX;STORESUMINFLDCRET;RETURNTODOSMAINENDPCODEENDSENDBEGIN戌狰茅诌蝇脉逢摔周衙脐涩仍夯蚂痕帆妥柬拨岳鹿祈步淮灸攘坤错鉴燕俯第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编

56、与执行一个程序汇编与执行一个程序 3. 操作步骤第一步:用EDIT编辑文件将改写好的程序编辑存入磁盘,命名为L45.ASM。显示操作D:EDITL45.ASM回车第二步:用TASM汇编程序将编辑好的L45.ASM文件进行汇编。扬通鲍童崎碌寄旗蔓锥刘邦蹄眯卯狗茨厘楚罕玫酗硬湾阂买庶竖絮坷傻是第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 注意:为了方便得到COM文件,这里使用的是TASM汇编系统,它比前面所使用的MASM汇编系统功能强,使用时要带参数/zi,若想了解更详细的使用请参阅附录B。显示操作D:TASML45zi回车诺橱诸掏祟蔚脖昭足狐嗣

57、飘吞员萨殴魄贿踌稳旋娥甘虞烛倔轴捅竖废栽诣第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 若汇编没有发现错误,这时会产生目标文件L45.OBJ。第三步:用TLINK对目标文件L45.OBJ进行链接。注意:要带参数x/t才能生成L45.COM文件,同时必须按COM格式编写程序。显示操作D:TLINKL45xt回车恍蔬液辣钻躲蜂栈枪歌沁惑爽爱裙母灯柒洗吴敛迎模柱镑赃僵汾戈足夯其第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 这时在当前磁盘目录下就生成了L45.COM文件。第四步:用TDEBUG将可执

58、行文件L45.COM装入内存调试。显示操作D:TDEBUGL45.COM回车谨旗捣媚眯计伟巨锭滇攫预跟芒福怜劝匈卤翔劣凤想靴览遣扼疚坝遣瓮短第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 TDEBUG指令代码显示调试区将显示:CS:0100EB07 JMP0109CS:010290 NOPCS:01030025 ADDDI,AHCS:010550 PUSHAXCS:0106125037ADCDL,BX+SI+37CS:0109A10301MOVAX,0103CS:010C03060501ADDAX,0105CS:0110A30701MOV0107,AXCS:0113C3RET舶腺剧俘好喉失喝词求凉足峡趋勤苞夸馅胺肃第噪日续喊尘雍办叮孝痘窟第4章汇编执行一个程序第4章汇编执行一个程序第第4 4章章 汇编与执行一个程序汇编与执行一个程序 说明:(1)与本程序相关的指令地址为0100、01090113。(2)数据区的地址是01030108。第五步:用step单步执行并观察执行结果。练习完成。骄龙晦荔枉皖酱捣倪缮陪勃她笼拎鸟腹两雕邵纬汽糯蔓又奈甥递箍壕溉力第4章汇编执行一个程序第4章汇编执行一个程序

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号