本节主要介绍了汇编语言源程序的编辑、汇编、连接的方法,DEBUG调试命令及其使用方法。 一、简介
汇编语言源程序:用汇编语句编写的解决应用问题的程序。 汇编程序:将汇编语言源程序翻译成机器语言程序的系统。 汇编:将汇编语言程序翻译成机器语言程序的过程。
在编辑汇编语言源程序时,对计算机硬件工作环境无特殊要求,对软件工作环境要求也很简单,只需用建立ASCII码文本文件的软件即可。 (1)编辑软件
行编辑软件:EDLIN.COM
全屏编辑软件:WPS、EDIT.COM、NE.COM、WORD、PE等。
当输入、建立和修改源程序时,可任选一种编辑软件,不要用格式控制符,要求编辑完成的文件扩展名一定是.ASM。 (2)汇编程序
有汇编ASM.EXE、宏汇编MASM.EXE及TASM等,一般使用宏汇编MASM.EXE,因它比ASM.EXE功能强。TASM适用于8086/8088~Pentium系列指令系统所编写的汇编语言程序,是比较先进的汇编工具。 (3)连接程序
用连接程序LINK.EXE或TLINK.EXE,将MASM.EXE产生的机器代码程序(.OBJ)文件连接成可执行程序.EXE,TLINK比LINK更先进。 (4)辅助工具程序(.EXE)
进行汇编语言程序调试和文件格式转换的程序有: DEBUG.COM 动态调试程序 EXE2BIN.EXE 文件格式转换程序 CREF.EXE 交叉引用程序
编辑、汇编、连接、调试过程如下图所示。
用编辑软件MASM程序LINK程序DEBUG程序建立源文件.ASM产生.OBJ目标代码文件连接生成.EXE文件调试 、运行程序 TD(turbo Debugger简称)也是动态调试程序,可在DOS和Windows环境下运行,用户界面十分友好。
二、汇编源程序
用编辑软件建立的源程序.ASM文件,必须经过汇编才能产生.OBJ文件。为此,需键入: C:>MASM <源文件名>↘ 或 C:>MASM↘
按前一种格式键入,屏幕上显示: Microsoft(R) Macro assemble Version 5.00
Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved OBJ filename[ 以上信息中方括中为该项提示的缺省回答值,冒号后面等待用户输入信息,若不改变缺省值则直接按回车键。 汇编后生成以下几个文件: (1).OBJ文件 .OBJ文件是必须生成的一个目标代码文件,当源程序中无语法错误时,则在当前工作盘上自动存入一个.OBJ文件,供下一步连接用。 若源程序有语法错误时,会出现错误信息提示: 源程序文件行 错误信息代码 错误说明信息 最后信息提示: ×× Warning errors (警告错误) ×× Severe errors (严重错误) 若严重错误总数不为0,则.OBJ文件没有生成,需回到编辑状态下修改源程序直到无错为止。 (2).LST文件(列表文件) .LST文件对调试程序有帮助,它是将源程序中各语句及其对应的目标代码和符号表以清单方式列出,如果需要,在屏幕显示的第二个提问的冒号后输入文件名即可,如果不需要,直接按回车键。 (3).CRF文件(交叉引用文件) 交叉引用.CRF文件给出了源程序中定义的符号引用情况,按字母顺序排列。.CRF文件不可显示,须用CREF.EXE系统程序将.CRF文件转换成为.REF文件后方可显示输出。 若按后一种格式输入,系统会依次出现四个提示信息,比第一种格式多了一项源程序文件名的输入,应答方式与第一种格式相同。 三、连接目标程序 汇编后生成的.OBJ文件,其所有目标代码的地址都是浮动的偏移地址,机器不能直接运行。必须用连接程序(LINK.EXE)对其进行连接装配定位,产生.EXE可执行文件,方可运行。 在系统提示符下键入:LINK <源程序文件名>↘ 或 LINK↘ 屏幕上出现以下提示信息: Microsoft(R) Macro assemble Version 5.00 Copyright(C) Microsoft Corp 1981-1985,1987 ALL rights reserved Run file [ 连接后,可生成两种文件:.EXE和.MAP (1).EXE文件(可执行文件) 若采用方括号中的默认值,直接按回车键,否则需重新输入一文件名。 若连接过程中无错误,则自动在当前工作盘生成.EXE文件。若有错误,则会给出错误信息提示,这时必须重新修改源程序,再汇编、连接。 (2).MAP(连接映像文件) (3).LIB库文件 连接程序询问是否使用某种库文件,不需使用库文件直接按回车键。 (4)若要连接多个模块目标程序,可用“+”把它们连接起来。 如:LINK files1+files2+files3↘ 若直接键入:LINK会依次出现四个提示信息,应答方式应与LINK<源程序文件>相同,仅增加了一项输出,询问被连接的目标文件名字。 四、运行程序 经过汇编、连接后生成的.EXE文件,可在DOS系统直接运行,只要键入相应的文件名即可。如:C:\\MASM><文件名>↘ DOS的COMMAND.COM模块将该程序装配到内存,并设置和分配启动地址。也可在DEBUG调试程序下运行。如何用DEBUG程序来运行和调试程序将在DEBUG调试程序中详细讨论。 五、DEBUG调试程序 DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。 利用DEBUG调试程序,可以将一个可执行程序(如.EXE、.COM等)装入内存中,并接管对程序运行的控制权,通过采取如反汇编、断点运行、单步执行、寄存器内容修改等方法,对可执行程序进行跟踪、调试,以找出其中的设计错误,然后再对源程序进行相应修改,重新生成正确的可执行程序。 1、 准备被调试程序: 假定所有有关文件均在当前路径C:\\MYTEST>下,按照前面的步骤生成一个被调试的可执行程序(如TEST.EXE),参考程序如下: DATA SEGMENT STR DB ‘Hello,World!$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,OFFSET STR MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 2、进入DEBUG环境:(其中斜体部分由键盘输入) C:\\ MYTEST>DEBUG TEST.EXE↘ - 其中,短线‘-’作为DEBUG环境的操作提示符,在此提示符下,可以输入各种DEBUG命令,对可执行程序TEST.EXE进行跟踪调试。 3、主要调试命令: 1)反汇编命令U:将存储器中的二进制数据翻译成较有意义的助记符形式,以帮助理解。一般常用以下格式: a) -U↘:从当前IP处开始,对连续约32字节内容反汇编。如对TEST.EXE,刚装入DEBUG 时的IP=0000,则在输入U命令后有如下显示: -U↘ 12B7:0000 B8B612 12B7:0003 8ED8 12B7:0005 BA0000 MOV AX,12B6 MOV DS,AX MOV DX,0000 12B7:0008 B409 MOV AH,09 12B7:000A CD21 12B7:000C B44C 12B7:000E CD21 INT 21 MOV AH,4C INT 21 12B7:0010 EB51 JMP 0063 12B7:0012 8B867AF MOV AX,[BP+FF7A] „„ „„ „„ 12B7:001F 8B4604 MOV AX,[BP+04] - 在上例中,12B7:0000表示CS:IP的内容(其中CS的值是动态值);B8B612代表该处存放的二进制数据,亦即指令MOV AX,12B6的机器代码;当连续约32字节的数据反汇编完后,重新回到DEBUG提示符“-”下,如果再键入U命令,则将继续对后面的内存区反汇编。 特别应该注意的是,由于反汇编命令针对内存区的二进制数据,而被调试程序仅占内存区的某一部分,故反汇编出来的内容并非全是被调试程序的代码,如上例中的JMP 0063以后的部分,显然不是TEST.EXE的内容。另外还需注意,DEBUG默认使用十六进制。 b) –U 0123↘:从指定的IP=0123处开始,对连续约32字节内容反汇编。 c) –U 0123 0143↘:从指定的IP=0123处开始反汇编,直至指定的0143处结束。 2)显示寄存器命令R:显示或修改寄存器的内容。一般常用以下形式: a)-R↘:显示所有寄存器当前的内容及当前将执行的指令。如对TEST.EXE,在程序运行之前,键入R命令: -R↘ AX=0000 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=12A6 ES=12A6 SS=12B6 CS=12B7 IP=0000 NV UP EI PL NZ NA PO NC 12B7:0000 B8B612 MOV AX, 12B6 - 在显示寄存器内容时,标志寄存器F(或程序状态字寄存器PSW)表示成各个分离的标志位,其意义如下表所示: 0 1 溢出 NV OV 方向 UP DN 中断 DI EI 符号 PL NG 零 NZ ZR 辅助进位 NA AC 奇偶 PO PE 进位 NC CY b)-R AX↘:显示指定的AX寄存器当前的内容,并等待键入新值;如果不作修改,可直接回车。如: -R AX↘ AX 0000 :1234↘ - c)-R F↘:显示标志寄存器F各个标志位的内容,并等待键入新的标志位;如果不作修改,可直接回车。如: -R F↘ NV UP EI PL NZ NA PO NC -ZR↘ - 3)运行命令G:使程序在DEBUG控制下运行,一般有全程、断点运行两种方式。 a)-G↘:控制程序由当前IP处运行,直至程序结束。如果当前IP为初始值,其作用则相当于直接在DOS下运行程序,一般用于快速观察程序的运行情况。 b)-G =0102↘:控制程序从偏移地址0102H处开始执行程序,直至程序结束。 c)-G 0123↘:控制程序由当前IP处运行,直至指定的断点IP=0123H处,程序暂停,显示各个寄存器的当前值及断点处指令,然后返回DEBUG提示符“-”下。如对TEST.EXE,若想观察字符串显示的入口参数是否设置好,则可以断点运行至000A处: -G 000A↘ AX=09B6 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=12B6 ES=12A6 SS=12B6 CS=12B7 IP=000A NV UP EI PL NZ NA PO NC 12B7:000A CD21 INT - 21 断点一般选取在需要观察的地方,当程序停下来后,可以根据各方面的情况(如寄存器、缓冲区、标志等)来判断程序是否运行正确。 4)单步命令T:控制程序运行一条指令后暂停,显示各个寄存器的当前值及断点处指令,然后返回DEBUG提示符“-”下。如对TEST.EXE,若当前IP为初始值,则键入T命令后有如下显示: -T↘ AX=12B6 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=12A6 ES=12A6 SS=12B6 CS=12B7 IP=0003 NV UP EI PL NZ NA PO NC 12B7:0003 8ED8 MOV DS,AX - 单步命令一般用于需对程序运行作仔细分析的地方,如判断分支转移、观察运算结果等。若能综合运用断点及单步指令,则可大大提高DEBUG 调试的速度及效率。但应注意,当IP指针位于INT 21H一类指令处时,执行T命令将会使程序进入该功能调用子程序中,因此,这种情况下最好不用T命令,而用断点运行命令跳过该类功能调用指令。 5)显示内存命令D:以十六进制及ASCII两种方式显示内存区的二进制数据,通常用来观察数据段内的缓冲区内容。一般常用以下二种形式: a)-D↘:从0000单元开始,连续显示128个内存单元的内容,如果继续键入D命令,则继续显示后128个单元内容。如对TEST.EXE,若想观察字符串显示时的字符串内容是否正确,则可在程序断点运行至000A处,键入D命令: -D DS:0↘ 12B6:0000 48 65 6C 6C 6F 2C 57 6F-72 6C 21 24 00 00 00 Hello,World!$... 12B6:0010 B8 B6 12 8E D8 BA 00 00-B4 09 CD 21 B4 4C CD 21 ...........!.L.! 12B6:0020 EB 51 8B 86 7A FF 2B C6-40 50 8A 46 08 98 50 8B .Q..z.+.@P.F..P. „„ „„ 12B6:0070 83 C4 02 8B 5E 04 8A 07-2A E4 86 7A FF 3B C6 ....^...*...z.;. - 在上例中,128个单元分成8行,每行16个单元,每个单元的内容分别以十六进制形式和ASCII码形式显示。如果该单元的内容不是可显示字符,则在ASCII区内显示为“.”。 b) –D 0123 0143↘:从指定的0123单元开始显示,直至指定的0143单元结束。 6)汇编命令A:用于在DEBUG环境下直接键入汇编语言语句、生成较简单的可执行代码而不必经过完整的汇编语言编程步骤,或者用来在调试过程中临时修改某条指令。 格式:A [[<段寄存器名>/<段地址>:] <段内偏移>] 上式等价于: a)A <段寄存器名>:<段内偏移> b)A <段地址>:<段内偏移> c)A <段内偏移> d)A 注:其中a)用指定段寄存器的内容作段地址,c)用CS的内容作段地址,d)以CS:100作地址。 例如: -A↘ 127D:0100 MOV AH,02↘ 127D:0102 MOV AL,6A↘ 127D:0104 INT 127D:0106 ↘ -A 0102↘ 127D:0102 MOV 127D:0104 ↘ - DL,6A↘ 21↘ 当键入汇编命令A后,将从当前IP或指定地址处提示输入汇编语句,每输入一条语句,DEBUG将其汇编成机器码,并存入相应的存储单元中,然后地址自动增加,继续提示输入下一条语句;如果直接回车,则结束汇编命令。特别应注意的是,DEBUG默认使用十六进制,故在输入时不能使用H。 7)退出命令Q:键入此命令,即退出DEBUG状态,返回DOS。 本节只对DEBUG几个主要调试命令进行了介绍,其它调试命令可以查阅相关参考书籍 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo3.cn 版权所有 湘ICP备2023017654号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务