实验一-DEBUG的使用(1)
实验一DEBUG的使用
一、实验目的
熟练掌握DEBUG的常用命令以及使用DEBUG调试程序的一般方法。
二、实验内容
1.熟悉DEBUG的常用命令
通过CMD命令进入DOS方式,运行DEBUG程序,练习DEBUG常用命令(DEBUG 常用命令详细说明见五和六)。
2.使用DEBUG调试程序
(1)用CMD命令进入DOS方式。
(2)运行DEBUG程序。
(3)使用A命令将以下笑脸程序逐行输入。
MOV DL,1
MOV AH,2
INT 21H
INT 20H
(4)使用T命令逐条指令运行笑脸程序,观察每条指令执行前后相关寄存器的内容变化情况。
(5)使用G命令连续运行笑脸程序,观察程序运行结果。
(6)使用R命令修改寄存器BX和CX的内容为笑脸程序的长度。
(7)使用N命令将笑脸程序命名为https://www.360docs.net/doc/05441853.html,。
(8)使用W命令将笑脸程序写到指定磁盘的指定路径目录中。
(9)退出DEBUG,进入笑脸程序所在目录。
(10)运行笑脸程序https://www.360docs.net/doc/05441853.html,。观察程序运行结果。
(11)用DEBUG调试已生成的https://www.360docs.net/doc/05441853.html,程序。
三、实验要求
认真完成实验每一步骤,详细记录实验过程、现象和结果,及时整理实验报告。
四、实验作业
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 B9
04 01 ..t.VW..!_^s....
127E:0210 FC 56 57 F3 A4 5F 5E C3-50 56 33 C9 33 DB
AC E8 .VW.._^.PV3.3...
127E:0220 C3 23 74 19 3C 0D 74 15-F6 C7 20 75 06 3A
06 14 .#t.<.t... u.:..
127E:0230 D4 74 0A 41 3C 22 75 E6-80 F7 20 EB E1 5E
58 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:70
B800:0070 30.41 07.f0 30.41 07.f0 30.41 07.f0
B800: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:显示所有寄存器的内容
-R
AX=0140 BX=2400 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=08F1
ES=08F1 SS=08F1 CS=08F1 IP=0104 NV UP DI PL NA PO NC
08F1:0104 EB0A JMP 0110
在显示命令执行时,最后显示的是标志寄存器的内容,其意义见表1-2。
例1-5:修改寄存器内容
要修改某寄存器内容,就可在R命令后打入寄存器名,DEBUG显示出这个寄存器原来的值,然后打入新值即可。例如:
-R AX
AX= 0104
:1234 ;写入新值
(3)汇编命令A
格式:A[<程序起始地址>]
功能:逐行汇编程序。主要用于小段程序的汇编和修改部分连续的目标代码。
说明:使用A命令汇编程序,一般不许使用标号和伪指令,但MS-DOS的DEBUG 允许使用DB和DW这两条伪指令。
A命令可用按Ctrl+C键退出。
例1-6:
-A 100
1000:0100 MOV DL,41
1000:0102 MOV AH,2
1000:0104 INT 21
1000:0106 INT 20
1000:0108 ∧C
- ;即按CTR和C键退出汇编命令A
(4) 4. 反汇编命令U
格式:U[<地址范围>]
功能:对指定地址范围内的二进制代码进行反汇编,常用于分析目标代码意义。
说明:<地址范围>项缺省时,反汇编起始地址由当前指令指针寄存器IP值决定。
例1-7:例1-6程序反汇编如下:
-U 100 106
1000:0100 B241 MOV DL,41
1000:0102 B402 MOV AH,02
1000:0104 CD21 INT 21
1000:0106 CD20 INT 20
-
其中地址范围为100到106。
(5)单步执行命令T
格式:T[<=起始地址>][<跟踪条数>]
功能:逐条跟踪执行程序指令。
说明:每条指令执行后都将显示各寄存器当前值。
例1-8:说明例1-6程序的单步执行:
-T
AX=0005 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127B ES=127B SS=127B CS=127B IP=0103 NV UP EI PL NZ NA PO NC
127B:0103 BB0600 MOV BX,0006
-T
AX=0005 BX=0006 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127B ES=127B SS=127B CS=127B IP=0106 NV UP EI PL NZ NA PO NC
127B:0106 01D8 ADD AX,BX
-T
AX=000B BX=0006 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=127B ES=127B SS=127B CS=127B IP=0108 NV UP EI PL NZ NA PO NC
127B:0108 CD20 INT 20
-T
AX=000B BX=0006 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=127B ES=127B SS=127B CS=00C9 IP=0FA8 NV UP DI PL NZ NA PO NC
00C9:0FA8 90 NOP
(6)执行程序命令G
格式:G[=<起始地址>][<断点>…]
功能:完整或分段执行程序。
说明:如果G命令不带参数,则从头到尾执行程序;如果有断点,则执行到断点地址时暂停并显示当前各寄存器状态。其中断点最多允许设置10个。程序正常时显示:
Program terminated normally。
例1-9
D:>DEBUG
-A
127B:0100 MOV AX,5
127B:0103 MOV BX,6
127B:0106 ADD AX,BX
127B:0108 INT 20H
127B:010A ^C
-G
Program terminated normally
(7)命名命令N
格式:N <文件名>
功能:命令命令将文件存放,以便在其后用L或W命令把文件装入存盘。
例如:
-N myprog
-L
-
可把文件myprog装入存储器。
(8)装入命令L
格式:L[<地址范围>]<指定扇区或者指定文件>
功能:把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中,或者装入指定文件。
(9)写命令W
格式:W[<地址范围>]<指定扇区或者指定文件>
功能:把数据写入磁盘的指定扇区,把数据写入指定的文件中。
(10)退出DEBUG命令Q
用DEBUG的Q命令,格式为:
-Q
返回操作系统。
其余命令参见Debug命令一览表。2. DEBUG命令一览表
.