您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 汇编语言之程序调试技术
2020/2/248086/8088宏汇编语言程序设计程序调试基本技术2020/2/248086/8088宏汇编语言程序设计程序调试我们以前学习了通过汇编程序MASM来将汇编语言源程序汇编成目标程序,使用连接程序LINK来将目标程序连接成可执行文件。而调试汇编语言程序的基本工具是DEBUG。在使用DEBUG调试程序时,能使程序员触及计算机内部,能观察并修改寄存器和存储单元的内容,能够监视程序的执行情况。所有DEBUG命令为单一字母,其后跟着一个或多个参数。命令中的参数之间必须用分界符号(空格或逗号)隔开。每个名字以回车键作为结束符。在DEBUG命令中,使用逻辑地址的格式是:段基值:偏移量。其中段基值可以用段寄存器名表示,也可以用十六进制数。在DEBUG状态下,命令参数中的数据和机器显示的数据均是十六进制数,且不以“H”结尾。2020/2/248086/8088宏汇编语言程序设计程序调试一、DEBUG的进入和退出在命令行状态宏汇编程序的当前目录下,输入DEBUG然后回车,就能进入DEBUG状态了,此时出现提示符“-”,调试人员就可以使用DEBUG的各命令了。首先应该装入待调试的可执行文件。方法是在提示符“-”后面输入N可执行文件名,然后回车,可执行文件名必须包含扩展名。也可以在调用DEBUG的同时转让可执行文件,方法是,在命令行状态宏汇编程序的当前目录下,输入DEBUG可执行文件名,然后回车。当完成可执行文件转入后,程序的目标代码、数据已全部装入内存指定单元。2020/2/248086/8088宏汇编语言程序设计程序调试程序装入内存后,CPU各寄存器内容处于初始状态:CS:程序开始运行的段基值IP:第一条要执行的指令的偏移量SS:段定义语句中组合类型指定为堆栈段的段基值SP:栈底+2单元的偏移量DS、ES:程序段前缀(PSP)的段基值标志寄存器:各标志位均为0状态DEBUG状态的退出:在提示符“-”后面输入Q,然后回车,就能退出调试状态。2020/2/248086/8088宏汇编语言程序设计程序调试二、显示命令1、显示内存单元内容:D命令命令格式:D地址或D范围例如:-DDS:100;从(DS)+100H开始显示80H个字单元的内容-D100;用上次使用的段寄存器从偏移量为100H开始显示80H个字单元内容-DDS:100110;显示DS数据段中偏移量从100H开始到110H结束的字单元内容在屏幕上显示的结果内容分为3部分:左边是每一行存储单元的起始地址(段基值:偏移量),中间是各字节单元两位十六进制数内容显示,右边是把中间各字节单元用相应的ASCII码字符表示,若为不可显示字符,便用”.”表示。2020/2/248086/8088宏汇编语言程序设计程序调试2、显示寄存器命令-R命令命令格式:-R输入R然后回车,在屏幕上将会显示各寄存器的内容。如下图所示:在第二行后半段显示标志寄存器的各标志位状态。各标志位的复位和置位状态用字符表示(显示字符见P209表11.1)。第三行表示现在CS:IP指向的一条指令,也就是下一条即将执行的指令。2020/2/248086/8088宏汇编语言程序设计程序调试3、显示源程序指令(反汇编):U命令在DEBUG状态下运行程序是执行内存区域内的目标代码,如果要知道执行的是什么指令,操作数在哪里,就需要把目标代码还原成源程序中的汇编指令。这就是所谓的反汇编。U命令就是把目标代码反汇编成源程序中的汇编指令。命令格式:U地址(从指定地址开始显示32个字节目标代码)或U范围(指定起始地址和结束地址或者指定起始地址和长度)如:UCS:12或UCS:1228或UCS:12L16都表示显示从CS:12开始32个字节目标代码的汇编指令。2020/2/248086/8088宏汇编语言程序设计程序调试三、修改命令1、修改内存单元内容-E命令E命令有两种格式:(1)用内容表修改内存单元格式:E地址内容表内容表为内存单元的新数据,各字节单元的数据以空格分开。例如–EDS:056‘ABC’23表示将以DS:0为起始地址的连续5个字节单元中依次存放数据56H,字符‘A’,‘B’,‘C’的ASCII码和数据23H。2020/2/248086/8088宏汇编语言程序设计程序调试(2)逐个内存单元修改命令格式:-E地址键入上述命令后,屏幕上显示出命令指定的单元地址及其内容。这时可输入新的两位十六进制数,以代替原来的内容。修改完此存储单元数据后可进行下面3种操作:键入空格:屏幕上显示下一个高字节单元的内容,并等待输入新数据,如果再键入空格则显示更高一个字节的内容,可以从低字节到高字节修改存储单元内容。键入连接号“-”:屏幕显示上一个低字节单元内容,并等待输入新数据,可从高字节到低字节修改。键入回车:结束这次内存修改。如果前两种操作未输入新数据就回车,则此单元数据未做修改。2020/2/248086/8088宏汇编语言程序设计程序调试2、修改寄存器内容命令格式:R寄存器名键入上述命令后,屏幕上立即显示寄存器名及其内容,然后等待输入新的最多4位16进制数。如内容无需修改则直接回车。修改标志寄存器时,输入命令RF,屏幕上显示标志寄存器各标志位对应的字符(P209表11.1),用户可以在后面输入修改的字符。8个标志位可以任意选择修改其中的一个或几个,且修改的顺序也是任意的。输入各标志显示字符之间可以是无间隔的,输入完后按回车即可完成修改。2020/2/248086/8088宏汇编语言程序设计程序调试3、汇编指令-A命令A命令主要用于小段程序的汇编,或对目标程序的修改。用A命令汇编或修改指令的目标代码之间存入指定的存储单元中。命令格式:A地址在键入A命令后,屏幕上显示存放指令目标代码的起始单元地址,并等待输入一条汇编指令。可输入指令系统中任一指令。当指令中需要说明存储单元是字或字节单元是,可用WO(即WORDPTR)或BY(即BYTEPTR)来表示操作数的类型。可以用DB或DW伪指令直接将字数据或字节数据存入相应单元中,如同源程序中一样,可以输入数,也可以输入字符串。2020/2/248086/8088宏汇编语言程序设计程序调试使用A命令时,不允许使用标号、变量名以及除DB、DW以外的伪指令。输入一条指令的末尾以回车键结束。如果没有输入指令就直接回车,表示A命令的结束。如:2020/2/248086/8088宏汇编语言程序设计程序调试四、程序运行1、连续运行方式-G命令命令格式:G[=地址][,地址][,地址],…其中第一个参数“=地址”是运行程序的起始地址,后面的参数是断点地址。由于指令地址以CS为段基值,所以地址参数仅包含偏移量。若没有指令起始地址,就以CS和IP现有内容为起始地址。第一个参数中的“=”是必不可少的,如果没有等号就会被当成断点地址。断点地址一定是一条指令的首字节地址,它只包含偏移量(各指令的首字节地址,可通过反汇编U命令显示)。2020/2/248086/8088宏汇编语言程序设计程序调试一条G命令的断点地址最多为10个。断点的顺序是任意的,无需按照地址顺序排列。断点地址参数仅对本次G命令有效,若再次使用G命令则需要重新指定断点地址参数。如果G命令带有断点地址参数,当程序运行到任一断点时,便立即停下来,并显示CPU个寄存器的内容和下一次要执行的指令。若G命令没有断点地址参数,那么程序就运行至结束,并显示“Programterminatednormally”。2020/2/248086/8088宏汇编语言程序设计程序调试2、跟踪运行方式-T命令命令格式:T[=地址][,值]其中,[=地址]为程序的运行起始地址,如果命令中未指定,就以CS和IP现有内容作为起始地址。[值]是程序运行的指令条数,如果命令中未指定,则默认为1条,即仅执行一条指令。执行T指令后,每执行完一条指令后,就自动显示CPU各寄存器和标志寄存器内容,待T命令指定的指令条数执行完后暂停程序的运行。2020/2/248086/8088宏汇编语言程序设计程序调试五、调试程序的过程:在用户程序经过编辑、汇编、连接后得到一个可执行文件后就需要借助于调试程序DEBUG来对程序进行调试,查看程序是否完成了预定功能。使用DEBUG的步骤:1、调用DEBUG,装入用户程序2、观察寄存器初始状态3、以单步工作方式运行程序:首先用T命令顺序执行用户程序的前几条指令,直到段寄存器DS、ES已预置为用户的数据段、附加段。4、观察用户程序数据段初始内容:在DS、ES已预置为用户的数据段、附加段后就可以用D命令查看初始数据。2020/2/248086/8088宏汇编语言程序设计程序调试5、继续以单步工作方式运行程序,遇到软中断指令INT则用G命令跳过,这种中断处理子程序通常很长。6、连续工作方式运行:在单步工作方式运行程序后,可再用连续工作方式从头运行程序,查看运行结果。7、如果程序结果不正确,则需修改程序,如果修改不多,则可用A命令修改,这种修改仅仅是临时修改内存中的可执行文件,待确认正确后,需修改源程序,并重新汇编、连接。8、运用断点调试程序:运用断点调试程序可以迅速找出问题的范围,然后在范围内使用单步运行T命令来找出错误。
本文标题:汇编语言之程序调试技术
链接地址:https://www.777doc.com/doc-3973813 .html