实验一DEBUG的使用一、实验目的熟练掌握DEBUG的常用命令以及使用DEBUG调试程序的一般方法。
二、实验内容1.熟悉DEBUG的常用命令通过CMD命令进入DOS方式,运行DEBUG程序,练习DEBUG常用命令(DEBUG 常用命令详细说明见五和六)。
2.使用DEBUG调试程序(1)用CMD命令进入DOS方式。
(2)运行DEBUG程序。
(3)使用A命令将以下笑脸程序逐行输入。
MOV DL,1MOV AH,2INT 21HINT 20H(4)使用T命令逐条指令运行笑脸程序,观察每条指令执行前后相关寄存器的内容变化情况。
(5)使用G命令连续运行笑脸程序,观察程序运行结果。
(6)使用R命令修改寄存器BX和CX的内容为笑脸程序的长度。
(7)使用N命令将笑脸程序命名为。
(8)使用W命令将笑脸程序写到指定磁盘的指定路径目录中。
(9)退出DEBUG,进入笑脸程序所在目录。
(10)运行笑脸程序。
观察程序运行结果。
(11)用DEBUG调试已生成的程序。
三、实验要求认真完成实验每一步骤,详细记录实验过程、现象和结果,及时整理实验报告。
四、实验作业1.用A命令或E命令将笑脸程序中第1条指令中的立即数修改为46,重复步骤(4)~(10),观察程序运行结果,分析为什么?如果要将笑脸程序修改为显示别的字符程序,如何修改程序?2.如果想无限循环显示笑脸,如何修改程序?3.写出实验体会。
五、DEBUG简介DEBUG是一种面向汇编语言的动态调试工具,共有19条命令。
DEBUG提供了可以跟踪、测试程序的环境和条件,使编程者能对. EXE和.COM文件的执行进行动态跟踪调试,能够较快地查找出文件中的逻辑错误和检查程序的运行结果。
此外,也可以在进入DEBUG后直接用小汇编语言(ASM)编写、调试一些小程序。
Microsoft DEBUG命令的具有以下共性:(1)DEBUG提示符为“-”。
(2)任何命令都以一个英文字母开头,后面跟一个或多个参数。
(3)命令字母和参数可用大写、小写或混合形式。
(4)命令字母和参数中相邻两个十六进制数之间必须用逗号或空格分开,其它各部分之间有无空格或逗号都可以。
(5)执行任何命令期间都可用Ctrl+Break或Ctrl+C结束命令的执行。
(6)键入命令字母和参数后必须按回车键才能使命令有效。
(7)在执行某命令期间,可按Ctrl + NumLock键暂停显示以便观察。
再按任何其它键,则继续显示。
(8)DEBUG检查输入命令的语法错误,即如果输入的命令有错误,将显示错误信息。
(9)在DEBUG程序状态下,控制键和DOS支持的编辑键继续有效。
(10)DEBUG的启动方式有两种:1)在DOS提示符下键入:DEBUG ADD.EXE (“”表示回车键,下同)将出现DEBUG状态的提示符“-”,系统这时已处于DEBUG程序的管理下,并把指定的可执行文件ADD.EXE调入内存。
此时,用户可在提示符“-”后输入DEBUG 命令对ADD. EXE 文件进行调试了。
2)在DOS 提示符下键入: DEBUG该方式没有指定被调试文件名,这种方式可以对目前在内存中的内容进行调试;若需装入调试文件,则可在DEBUG 环境下用Name 和Load 命令调入需要调试的文件: -NADD.EXE-L在装入要调试的文件后,就可以使用DEBUG 命令对文件进行调试了。
六、 Microsoft DEBUG 常用命令及使用说明1.DEBUG 常用命令 (1) 内存单元访问命令内存单元一般存放数据的形式在屏幕如表1.1所示。
Debug 中内存单元访问命令一般包括:显示内存单元内容命令(D),向内存单元输入数据命令(E)和在指定内存区域填充数据命令(F)。
表1.1 存储器内容显示形式地址十六进制数据ASCII 码字符127E:0200 0A C0 74 09 56 57 E8 84-21 5F 5E 73 0A B904 01 ..t.VW..!_^s....127E:0210 FC 56 57 F3 A4 5F 5E C3-50 56 33 C9 33 DBAC E8 .VW.._^.PV3.3...127E:0220 C3 23 74 19 3C 0D 74 15-F6 C7 20 75 06 3A06 14 .#t.<.t... u.:..127E:0230 D4 74 0A 41 3C 22 75 E6-80 F7 20 EB E1 5E58 C3.t.A<"u... ..^X.1)D 命令格式:D[<地址范围>]功能:显示地址范围内的内存数据,包括十六进制数及其对应ASCII 码。
例1-1:输入如下命令:-D 100 130 显示结果如下:0F2A:0100 12 08 2F 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ../………….0F2A:0110 B8 3A 0F 8E D8 BB 00 00-8A 07 43 02 07 43 02 07 8:..X;...C..C..0F2A:0120 A2 03 00 B4 4C CD 21 00-00 00 00 00 00 00 00 00 "..4LM!……..0F2A:0130 00 00 00 00 00 00 00 00 -00 00 00 00 00 00 00 00 …………….其中0100至0130是DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。
这里没有指定段地址,D命令自动显示DS段的内容。
如果只指定首地址,则显示从首地址开始的80个字节的内容。
如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。
2)输入数据命令(E)格式:E<地址>[<字符串>]功能:逐个修改指定单元内容、或用字符串替代指定连续单元内容。
说明:字符串可以是以单引号括起来的字母、数字或一系列用空格分开的十六进制字节。
输入数据命令E有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。
例1-2:修改内存单元从112开始的内容为“END OF PROGRAM”。
-E 112 ‘END OF PROGRAM’第二种格式则是采用逐个单元相继修改的方法。
命令格式为:-E address例如,-E DS:100则可能显示为:18E4:0100 89.-如果需要把该单元的内容修改为78,则用户可以直接键入78,再按"空格"键可接着显示下一个单元的内容,如下:18E4:0100 89.78 1B.-这样,用户可以不断修改相继单元的内容,直到用ENTER键结束该命令为止。
例1-3:逐个单元向彩显缓冲区输入数据,彩显缓冲区内存段地址为B800H,其结果立即在屏幕上显示出来。
下面的命令在屏幕上显示3个白底黑字闪烁的大写A。
-E b800:70B800:0070 30.41 07.f0 30.41 07.f0 30.41 07.f0B800:0078 20.注意:点前为原来的内容,点后为键入数据,41是A的ASCII码,f0表示显示属性(白底黑字闪烁)。
每输入一个字节按空格键到下一内存单元。
3)填充数据命令(F)格式:F[<寄存器>]功能:逐个填充指定单元内容、或用字符串替代指定连续单元内容。
例如:-F 02FA:0100 5 F3'XYZ'8D使02FA:0100~0104单元包含指定的五个字节的内容。
如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定的范围,则重复使用list填入,直到填满指定的所有单元为止。
(2)访问寄存器命令R格式:R[<寄存器>]功能:显示或修改寄存器内容。
说明:当R命令后不带参数时,显示各寄存器的内容,否则修改指定寄存器的内容。
在显示寄存器的内容时,首先显示13个16位寄存器的内容,随后是标志寄存器的内容,最后一行是下一条要执行的指令地址及指令内容。
例1-4:显示所有寄存器的内容-RAX=0140 BX=2400 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=08F1ES=08F1 SS=08F1 CS=08F1 IP=0104 NV UP DI PL NA PO NC08F1:0104 EB0A JMP 0110在显示命令执行时,最后显示的是标志寄存器的内容,其意义见表1-2。
例1-5:修改寄存器内容要修改某寄存器内容,就可在R命令后打入寄存器名,DEBUG显示出这个寄存器原来的值,然后打入新值即可。
例如:-R AXAX= 0104:1234 ;写入新值(3)汇编命令A格式:A[<程序起始地址>]功能:逐行汇编程序。
主要用于小段程序的汇编和修改部分连续的目标代码。
说明:使用A命令汇编程序,一般不许使用标号和伪指令,但MS-DOS的DEBUG 允许使用DB和DW这两条伪指令。
A命令可用按Ctrl+C键退出。
例1-6:-A 1001000:0100 MOV DL,411000:0102 MOV AH,21000:0104 INT 211000:0106 INT 201000:0108 ∧C- ;即按CTR和C键退出汇编命令A(4) 4. 反汇编命令U格式:U[<地址范围>]功能:对指定地址范围内的二进制代码进行反汇编,常用于分析目标代码意义。
说明:<地址范围>项缺省时,反汇编起始地址由当前指令指针寄存器IP值决定。
例1-7:例1-6程序反汇编如下:-U 100 1061000:0100 B241 MOV DL,411000:0102 B402 MOV AH,021000:0104 CD21 INT 211000:0106 CD20 INT 20-其中地址范围为100到106。
(5)单步执行命令T格式:T[<=起始地址>][<跟踪条数>]功能:逐条跟踪执行程序指令。
说明:每条指令执行后都将显示各寄存器当前值。
例1-8:说明例1-6程序的单步执行:-TAX=0005 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=127B ES=127B SS=127B CS=127B IP=0103 NV UP EI PL NZ NA PO NC127B:0103 BB0600 MOV BX,0006-TAX=0005 BX=0006 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=127B ES=127B SS=127B CS=127B IP=0106 NV UP EI PL NZ NA PO NC127B:0106 01D8 ADD AX,BX-TAX=000B BX=0006 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=127B ES=127B SS=127B CS=127B IP=0108 NV UP EI PL NZ NA PO NC127B:0108 CD20 INT 20-TAX=000B BX=0006 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000DS=127B ES=127B SS=127B CS=00C9 IP=0FA8 NV UP DI PL NZ NA PO NC00C9:0FA8 90 NOP(6)执行程序命令G格式:G[=<起始地址>][<断点>…]功能:完整或分段执行程序。