1.1 实验目的
(1)学习如何在Windows的命令模式下启动DEBUG。 (2)掌握DEBUG的常用基本命令。
(3)学习如何使用DEBUG查看CPU和内存以及进行跟踪调试。
1.2 实验设备及软件环境
通用微型计算机一台。 软件环境要求:
1. 操作系统:DOS、Windowsxp
2. 语言环境: Debug调试程序、MASM宏汇编。
1.3 预备知识
1 什么是DEBUG?
Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器的内容、内存的情况和在机器码级跟踪程序的运行。
2 常用的Debug命令及其含义
表1.1 Debug命令及其含义
命令格式 功能说明 R [寄存器名] 查看、改变CPU寄存器的内容 D [范围] 查看指定范围内的内存中的内容 E 起始地址 字节值表 用值表中的值替换从“起始地址”开始的内存单元中的内容 U [范围] 反汇编,将内存中的机器指令翻译成汇编指令 T [=地址][指令数] 执行一条机器指令 A [地址] 以汇编指令的格式在内存中写入一条机器指令 Q 退出Debug,回到DOS状态 3 启动DEBUG
(1)打开Windows命令窗口
选择“开始”→“运行”→输入“cmd”命令 (2)启动DEBUG
在命令窗口中启动DEBUG,将显示连接符“-”,这时可输入各种DEBUG命令。 (3)关于使用命令的几点说明:
在提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行; 命令是单个字母,命令和参数的大小写可混合输入
可用F1、F2、F3、Ins、Del、→等编辑键来编辑本行命令 当命令出现语法错误时,将在出错位置显示“^Error” 在DEBUG中使用的数都是以十六进制来表示的
1.4 实验内容
1 R命令
作用:查看、改变CPU寄存器的内容
(1)显示所有寄存器之中的内容:输入R
我们重点关注AX、BX、CX、DX、CS及IP寄存器的内容,其他寄存器SP、BP、SI、DI、ES、SS及标志寄存器先不予理会。此外,并列出了CS:IP所指向的内存单元处所存放的机器码,并将它翻译为汇编指令。 (2)改变寄存器中的内容:输入R AX
在提示符“:”后输入1111,即可将AX的值设置为1111。在输入R命令,查看修改后的寄存器值。
练习:
(1)用R命令修改IP的值,并查看此时CS:IP的指向,存放的机器码以及对用的汇编指令;
(2)用R命令修改CS的值,并查看此时CS:IP的指向,存放的机器码以及对用的汇编指令;
2 D命令
作用:查看指定范围内的内存中的内容 (1)直接输入D命令
DEBUG将输出3部分内容,查看执行结果。 说明:
左边是每行的起始地址,用“XXXX:YYYY”表示,其中XXXX表示内存单元的段地址,YYYY表示内存单元的偏移量;
中间以十六进制的形式显示从指定地址开始的128个内存单元的内容,每行显示16个
字节的内容;
右边显示每个内存单元中的数据对应的可显示的ASCII码字符,若没有对应可显示的ASCII码字符,DEBUG用“.”来代替。 (2)执行带参数的D命令
若执行带参数的命令D,DEBUG将显示指定地址范围的内容。带参数的方式有三种。 方式一:D 起始位置
DEBUG从起始位置开始显示128个字节的内容。 输入命令:D 1AF5:100 方式二:D 起始位置 结束位置
DEBUG从起始位置开始一直显示到结束位置。 输入命令:D DS:100 11F 方式三:D 起始位置 L长度
DEBUG命令从起始位置开始显示指定长度内容。 输入命令:D DS:100 L10
使用带参数的D命令后,接着使用D命令,可列出后续的128个内存单元的内容。 练习:
(1)使用D命令,查看内存10000H处的内容; (2)使用D命令,查看1000:0~1000:9中的内容
(3)采用三种不同的段地址和偏移地址查看同一物理地址10000H中的内容
3 E命令
格式:E 起始地址 字节值表 或 E 起始地址
作用:用值表中的值替换从“起始地址”开始的内存单元中的内容
例1:将内存1000:0~1000:9单元中的内容分别写为0、1、2、3、4、5、6、7、8、9,可用“E 起始地址 数据 数据 数据 数据 数据„„”的格式来进行。 步骤:
① 用D命令查看1000:0~1000:f单元的内容:D 1000:0 f
② 用E命令修改从1000:0开始的10个单元中的内容:E 1000:0 0 1 2 3 4 5 6 7 8 9 ③ 用D命令查看1000:0~1000:f单元中内容的变化:D 1000:0 f
例2:用E命令向内存中写入字符。从内存1000:0开始写入:数值1,字符“a”,数值2,字符“b”,数值3,字符“c”。 步骤:
① 用D命令查看1000:0处的内容:D 1000:0 ② 用E命令输入:E 1000:0 1 ‘a’ 2 ‘b’ 3 ‘c’
③ 用D命令查看1000:0~1000:f单元中内容的变化:D 1000:0 f
例3:用E命令向内存中写入字符串。从内存1000:0开始写入:数值1,字符串“a+b”,数值2,字符串“c++”,数值3,字符“IBM”。 步骤:
① 用D命令查看1000:0处的内容:D 1000:0
② 用E命令输入:E 1000:0 1 ‘a+b’ 2 ‘c++’ 3 ‘IBM’
③ 用D命令查看1000:0~1000:f单元中内容的变化:D 1000:0
例4 用E命令以提问的方式来逐个地修改从某一地址开始的内存单元中的内容。
以从1000:10单元开始为例。 步骤:
① 用D命令查看1000:10处的内容:D 1000:10 ② 用E命令输入:E 1000:10,按Enter键
③ DEBUG将显示起始地址1000:0010以及第一个单元(即1000:0010单元)的原始内容:00.,然后光标停在“.”的后面,提示输入想要写入的数据,此时有两种选择:其一输入数据,完后按空格键,即用输入的数据改写当前的内存单元;其二不输入数据,直接按空格键,则表示不对当前内存单元进行改写 ④ 当前单元处理完成后(不论是改写或者没有改写,只要按了空格键,就表示处理完成),DEBUG将显示下一个内存单元的原始内容,并提示进行修改,可以用同样的方法进行处理
⑤ 所有希望改写的内存单元改写完毕后,按ENTER键,E命令结束 ⑥ 用D命令查看1000:10单元中内容的变化:D 1000:10
4 U命令
格式:U[范围]
作用:反汇编,即显示机器码所对应的汇编指令 命令执行完后,DEBUG显示的输出内容包括3个部分:每一条机器指令的地址、机器指令、机器指令所对应的汇编指令。
若命令中不写“范围”参数,则把从CS:100开始的20H个字节内容反汇编成汇编指令,并显示出来;
若命令中只有“起始地址”,则把从该“起始地址”开始的20H个字节内容反汇编成汇编指令;
若命令中只有“起始地址”和“终止地址”,则把从“起始地址”到“终止地址”之间的字节内容反汇编成汇编指令。 例1:执行命令 U 100,查看执行结果
例2:执行命令 U 100 10C,查看执行结果。表示对从CS:100到10B的内存单元进行反汇编。
例3:用E命令向内存中写入机器码,用U命令查看内存中机器码的含义。 机器码 对应的汇编指令 b8 01 00 mov ax,0001 b9 02 00 mov cx,0002 01 c8 add ax,cx
① 用E命令输入E 1000:0 b8 01 00 b9 02 00 01 c8 ② 用D命令查看1000:0单元内容:D 1000:0
③ 用U命令查看1000:0单元中机器码的含义:U 1000:0
5 T命令
格式:T[=地址][指令数]
作用:跟踪执行,从起点(或当前点)执行若干条指令 若不写“地址”,则T命令从CS:IP处开始执行,“指令数”是要执行的指令数。 若只用T命令,则从CS:IP处执行一条指令。
例:简单地使用T命令,可以执行CS:IP指向的指令。 ① 首先用E命令向1000:0开始的内存单元中写入8个字节的机器码:E 1000:0 b8 01 00 b9 02 00 01 c8 ② 用R命令查看CPU中寄存器的状态:R (可以看到CS=? IP=?,指向CS:IP) ③ 用R命令修改CS,IP中的内容,使CS:IP指向1000:0 ④ 使用T命令执行写入的指令
(执行T命令后,CPU执行CS:IP指向的指令,则1000:0处的指令b8 01 00即mov ax,0001得到执行,指令执行完后,DEBUG显示输出CPU中寄存器的状态)
⑤ 用T命令继续执行后面的指令,注意每条指令执行后,CPU相关寄存器内容的变化。
6 A命令
作用:以汇编指令的形式向内存中写入指令
(1)简单地使用A命令,从一个预设的地址开始输入指令 例:输入A,写入指令:mov ax,1 mov bx,2 mov cx,3 add ax,bx add ax,cx add ax,ax
(2)给出起始地址的A命令
例:A 1000:0,写入指令:mov ax,1 mov bx,2 mov cx,3 add ax,bx add ax,cx add ax,ax
1.5 实验任务
(1)使用DEBUG,将下面的程序段写入内存,逐条执行,观察每条指令执行完后,CPU中相关寄存器中内容的变化。
提示:可以用E命令和A命令以两种方式将指令写入内存。并注意用T命令执行时,CS:IP
的指向。
机器码 汇编指令 B8 20 4e mov ax,4e20h 05 16 14 add ax,1416h Bb 00 20 mov bx,2000h 01 d8 add ax,bx 89 c3 mov bx,ax 01 d8 add ax,bx B8 1a 00 mov ax,001ah Bb 26 00 mov bx,0026h 00 d8 add al,bl 00 dc add ah,bl 00 c7 add bh.al B4 00 mov ah,0 00 d8 add al,bl 04 9c add,9ch
(2)向内存从B8100H开始的单元中填写数据,如: -e b810:0000 01 02 03 04 05 05 06
注意:先填写不同的数据,观察产生的现象;再改变填写的的地址,观察产生的现象。 (3)使用DEBUG,讲下面的程序段写入内存,逐条执行,根据指令执行后的实际情况填空。
Mov ax,ffff Mov ds,ax Mov ax,2000 Mov ss,ax Mov sp,0100
Mov ax,[0] ;ax= Add ax,[2] ;ax= Mov bx,[4] ;bx= Add bx,[6] ;bx=
Push ax ;sp= ;修改的内存单元的地址是 ;内容为 Push bx ; sp= ;修改的内存单元的地址是 ;内容为 Pop ax ; sp= ; ax= Pop bx ; sp= ; ax=
Push [4] ; sp= ;修改的内存单元的地址是 ;内容为 Push [6] ; sp= 修改的内存单元的地址是 ;内容为
因篇幅问题不能全部显示,请点此查看更多更全内容