- 121.01 KB
- 6页
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
下面介绍两种方法來建立一个汇编语言源程序并且经过编译连接、调试运行。编译程序选择微软的MASM5.0o该汇编编译程序是DOS下的老牌编译工具。一、命令行方式:1、源程序的建立可以使用任何一种文本编辑器(如记事本、写字板等,在DOS下可以使用EDIT來编辑)。在保存文件时不要忘了汇编语言源程序的扩展名应为.asmo例:打开上面所说的任何一种文本编辑器,输入下面的汇编代码:(这是一个两数相加的程序,把BUF中的10与20相加)CODESEGMENTASSUMECS:CODE,DS:CODEORG100HSTART:JMPBEGINBUFDB10,20,?BEGIN:PUSHCSPOPDSMOVAL,BUFADDAL,BUF+1MOVBUF+2,ALMOVAH,4CHINT21HCODEENDSENDSTART输入完了,把它保存到编译程序masm目录下,如masm在D:盘,这个源文件名为add.asm,那么就把add.asm保存到D:masm目录下。2、编译这一步是对汇编源程序add.asm进行编译。在DOS状态的提示符d:masm下键入masmadd.asm编译程序就会出现各种提示,然后进行编译,如下所示:(在出现的每一个提示后回车)图中所示Objectfilename是二进制目标文件,Sourcelisting是列表文件,Cross-reference是交义引用文件。由于在提示符后直接回车,所以只产生了一个文件:add.obj(二进制目标
文件),而没有产生NUL.lst例表文件)和NUL.crf(交叉引用文件)°对于这儿个文件,以后会讲,现在暂吋不管它。其中的add.obj将用于连接后生成可执行文件。当源程序正确没有错误吋,会出现0WarningError0ServerError的信息,表示编译通过。否则,还需要根据提示的错误信息,找出错误后再进行编译。3、连接对生成的二进制目标文件进行连接后可以生成运行文件add.exe连接操作如下:在DOS的d:masm下键入linkadd.obj,出现如下提示:(在出现的每一个提示后按回车)这时生成了add.exe文件。对于出现的LINK:warningL4021:nostacksegment的提示,意思是没有定义堆栈段,可以不管它。4、调试对于每一个程序,虽然编译连接通过,但是并不能保证在运行吋没有逻辑错误或者其它的运行时错误。这时就需要通过调试手段來排除这些错误。在DOS命令行下,可以用Debug来调试。如果会熟练使用Debug调试程序,对于汇编程序的调试是有很大帮助的。(对于Debug的详细用法,以后会讲)在DOS状态下,键入Debugadd.exe进入Debug状态,并对add.exe进行调试。女口下:冋车后出现了一个闪动的「符号,在这个符号后面可以键入各种Debug命令。键入U命令(U是反汇编,键入这个命令后可以看到add.exe的汇编代码),回车:D:
asn>debugadd.exe_U648:0100EB04JMP0106B48:010290NOPB48:01030A14ORDL,[SI]B48:0105000E1FA0ADD[A01FJ.CLB48:01090301ADDAX,[BX+DIJB48:010B02060401ADDAL,[0104JB48:010FA20501MOU[0105J.ALB48:0112B44CMOUAH.4CB48:0114CD21INT21B48:01167509JNZ0121
B48:0118FF4EFEDECWORDPTR[BP-02JB48:011B837EFE00CMPWORDPTR[BP-02J.+00B48:011F75EFJNZ0110
可以看到在命令后面的第一条语句是0B48:0100EB04JMP0106这就是我们编写的汇编源程序里面的JMPBEGIN可以看到BEGrN这个符号经过编译后成了偏移地址0106。下面对这条语句标识一下:0B4&0100EB04JMP0106TTTT代码段地址偏移地址机器码汇编代码其屮汇编代码JMP0106翻译成机器码就是EB04o程序最后执行的都是机器码,这里是用十六进制表示的二进制机器码。由图中我们看到只有一条语句即JMP0106与先前写的源程序对应。而后面的语句是什么,完全不是源程序屮的汇编语句。这是由于有一个JMP跳转语句的原故。没有跳转到放代码的地址,当然看不到源程序的代码。用T命令:(T命令是跟踪调试命令,这里只执行一条语句)B48:011B837EFE00B48:011F75EFMN■T回车WORDPTR[BP-02J.+00■叮rTrTrTrTrTrl0110CX=0116DX=0000SP=0000BP=0000SI=00SS=0B48CS=0B48IP=0106NUUPElPLNPUSHCS出现在后面的是寄存器的状态、标志位的状态及下面的一条将要执行的指令PUSHCS再用U命令看一下:・u回车88888888888884444444444444010601070108010B010F0112011401160118011B011F012101250EIFA0030102060401A20501B44CCD217509FF4EFE837EFE0075EF837EFE007428PUSHPOPMOUADDMOUMOUINTJNZDECCMPJNZCMPJZCSDSAL,[0103JAL,[0104J[0105J,ALAH,4G210121WORDPTR[BP-02JWORDPTR[BP-02J.+000110WORDPTR[BP-02J.+00014F
可以看到从偏移地址0106至0114就是我们的汇编代码。然后,可以用T命令一步一步的进行调试观察。怎样观察调试过程屮存储器里面的数据变化使用D命令(D命令是显示存储单元的命令)。当用T命令跟踪到MOVAL,[0103]吋,键入:・dl03就可以看到在数据段偏移地址0103处存放在BUF中的数据0A14,其中0A和14是以十六进制表不的10和20o0B48:01060EPUSHCSX=0000BX=0000S=0B38ES=0B38B48:0107IFCX=0116DX=0000SS=0B48CS=0B48POPDSSP=FFFEIP=0107BP=0000SI=0000DI=0000NUUPElPLNZNAPONCFtX=0000S=0B48B48:0108-d103B48:0100B48:0110B48:0120B48:0130B48:0140B48:0150B48:0160B48:0170B48:0180BX=0000ES=0B38A00301CX=0116SS=0B48MOUSP=0000IP=0108DX=0000CS=0B48AL,[0103]BP=0000SI=0000DI=0000NUUPElPLNZNAPONCDS:0103=0A137AFF0B0843FFC85F6FFFAE0E45FF054EA1E0B78C550A4CFE05755FB81214CD0038E28BC0B80144B57502708E0D0E752874465D500F1F-A009-FF2B-C00D-8AFE-FFC3-55FF-7650-E83EE4EB430450480A01FE5F24FEECE84823BFB31308850888067EE58AC0ECFFC44EDD58320F5070801030164B00C8E5C2A27590ElB8B806C0当程序执行完毕,再用D命令观察一下:-D103AX=4C1EBX=0000DS=0B48ES=0B380B48:0114CD21CX=0116DX=0000SS=0B48CS=0B48INT21SP=0000IP=0114BP=0000SI=0000DI=0000NUUPElPLNZNAPENCX=4C1ES=0B480A7:107C-d103B48:0100B48:0110B48:0120B48:0130B48:0140B48:0150B48:0160B48:0170B48:0180BX=0000ES=0B3890137AFF0B0843FFC85F6FFFAE0E45FF05CX=0116DX=0000SS=0B48CS=00A7NOPSP=FFFAIP=107CBP=0000SI=0000DI=0000NUUPDIPLNZ25018860A79EBB0C1030164B00C8E5C24EDD58320F5070806E5A0CF407E8CEFC23BFB313088508881EF4EC880F52FEE43EE4EB430450480A0F0AF56COAFC8F57E--------F9BDE3F01020FCF5E5846D0F07274550E144B57512708E0D4D082B081C03E8CBACE55F8204F075B14EA1E045B78C557ENAPENC■■FG■■■L■■■■■8■•■■■■■+■■■■■■N人■■■$■■■■■■]■■■・U■■■■■■■人•■人P■U■■■•■■■■■■■■■■P■UU■N■■■■■■H■■■■■■■■U■■■U.■■+■可以看到在偏移0105地址处,数字为1E,这就是0A与14相加后的结果,其结果由语句
MOVBUF+2,AL送到偏移0105保存。