宏汇编程序—MASM5.0 动态调试程序DEBUG

动态调试程序 DEBUG.COM

在编写和运行汇编程序的过程中,会遇到一些错误和问题,需要对程序进行分析和调试,调试程序 DEBUG 就是专为汇编语言设计的一种调试工具。它在调试汇编语言程序时有很强的功能,能使程序设计者接触到机器内部,能观察和修改寄存器和存储单元内容,并能监视目标程序的执行情况,使用户真正接触到 CPU 内部,与计算机产生最紧密的工作联系。

动态和程序 DEBUG 的主要特点

1 )能够在最小环境下运行汇编程序

在 DOS 状态下运行汇编程序,必须将程序经过 MASM 汇编程序,而后还要经过 LINK 连接程序产生可执行程序,才能最终运行,比较麻烦。在 DEBUG 状态下,为用户提供了调试、控制测试的环境,可以在此环境下进行编程、调试、监督、执行用户编写的汇编程序。因此调试周期短,为用户提供了极大的方便。

2 )提供极简单的修改手段

DEBUG 提供了修改命令,可以修改内存单元内容,修改寄存器的内容,为调试程序、修改程序带来了方便。

3 )提供用户与计算机内部联系的窗口

DEBUG 具有显示命令,它既可以使用户看到某内存单元或某一块单元内容,也可以看到 CPU 内部各寄存器的内容。用单步执行命令实现跟踪执行,每执行一步都使用户看到各寄存器的内容的变化,以便分析和调整程序。

4 )可装入、修改或显示任何文件

当然在 DEBUG 状态下运行汇编程序也具有一定局限性。在 DEBUG 状态下运行的程序不能使用宏汇编程序中的宏指令,大部分伪指令也不能使用,因此只能把程序分段调试。此外,不能调试太长的程序,只能分块进行中程序设计。在 DEBUG 状态下调试好的程序不能形成可执行文件( .EXE ),因此调试好的程序只能记下,到编辑环境下重新键入调试好的程序,通过汇编程序(如 MASM ),再通过连接程序( LINK )形成可执行文件( .EXE )。

DEBUG 的执行

在操作系统( DOS 或 WIndows )命令行方式下,直接调入 DEBUG 程序,键入命令的格式如下:

D>DEBUG [d:][Path][filename[.ext]][Parm1][Parm2]

其中 [] 的内容为可选项,可以有也可以缺省。

[d:] 为驱动器号,指要调入 DEBUG 状态的可执行文件在哪个驱动器中,如 A: 、 B: 、 C: 等。

[Path] 为路径,指要调入 DEBUG 状态的可执行文件是在哪个目录下或子目录下。

[filename[.ext]] ,指要调入 DEBUG 状态下的可执行文件的文件名,该文件可以是通过编辑、汇编、连接后产生的可执行文件,也可以是在 DEBUG 状态下汇编的程序 段,通过写盘命令 W 写入磁盘的文件。

[Parm1][Parm2] 为任选参数,是给定文件的说明参数。

在启动 DEBUG 时,如果输入 filename (文件名),则 DEBUG 程序把指定文件装入内存,用户可以通过 DEBUG 的命令对指定文件进行修改、显示或执行。如果没有文件名,则是以当前内存的内容工作,或者用命名命令或装入命令把需要的文件装入内存,然后再通过 DEBUG 命令进行修改、显示或执行。

当启动 DEBUG 程序后,屏幕上出现“—”,说明系统已进入 DEBUG 状态。

DEBUG 命令格式

( 1 ) DEBUG 命令都是一个英文字母,后面跟着一个或多个有关参数。多个操作参数之间用“ , ”或空格隔开。

( 2 ) DEBUG 命令必须接着按 ENTER 键,命令才有效。

( 3 )参数中不论是地址还是数据,均用十六进制数表示,但十六进制数据后面不要用“ H ”。

( 4 )可以用 Ctrl 和 Break 键来停止一个命令的执行,返回到 DEBUG 的提示符“—”下。

( 5 )用 Ctrl - Num Lock 键中止正在上卷的输出行,再通过按任意键继续输出信息。

主要 DEBUG 命令

( 1 )汇编命令 A

格式: a. A [ 段寄存器名 ]:[ 偏移地址 ]

b. A [ 段地址 ]:[ 偏移地址 ]

c. A [ 偏移地址 ]

d. A

功能:用该命令可以将汇编语言程序直接汇编进入内存。

当键入 A 命令后,显示段地址和偏移地址等待用户键入汇编指令,每键入一条汇编指令回车后,自动显示下一条指令的段地址和偏移地址,再键入下一条汇编指令,直到汇编语言程序全部键入,又显示下一地址时可直接键入回车返回到提示符“-”为止。

其中 a 的段地址在段地址寄存器中,因此在使用该命令时必须将段地址寄存器送入段地址, c 的地址在 CS 中, d 的段地址在 CS 中,偏移地址为 100H 。

( 2 )显示内存命令 D

格式: a. D [ 地址 ]

b. D [ 地址范围 ]

c. D

功能:显示指定内存范围的内容。

显示的内容为两种形式:一种为十六进制内容,一种为与十六进制相对应的 ASCII 码字符,对不可见字符以“·”代替。

对于 a 、 c 每次显示 128 个字节内容, b 显示的字节数由地址范围来决定。

若命令中有地址,则显示的内容从指定地址开始,若中中无地址(如 c )则从上一个 D 命令所显示的最后一个单元的下一个单元开始。若以前没有使用过 D 命令,则以 DEBUG 初始化的段寄存器的内容为起始段地址,起始偏移地址为 100H ,即 CS:100 。

对于 a 中的地址为偏移地址,段地址为 CS 的内容,对 b 中的地址范围,可以指定段地址和起始偏移地址和终止偏移地址。

( 3 )修改存储单元内容命令 E

格式: a · E [ 地址 ] [ 内容表 ]

b · E [ 地址 ]

功能: a ·用命令所给定的内容表去代替指定地址范围的内存单元内容。

b ·一个单元一个单元地连续修改单元内容。

其中:内容表为一个十六进制数,也可以是用单引号括起的一串字符。

( 4 )填充内存命令 F

格式: F [ 范围 ][ 单元内容表 ]

功能:将单元内容表中的内容重复装入内存的指定范围内。

( 5 )内存搬家命令 M

格式: M [ 源地址范围 ][ 目标起始地址 ]

其中源地址范围和目的起始地址为偏移地址,段地址为 DS 的内容。

功能:把源地址范围的内容搬至以目标起始地址开始的存储单元中。

( 6 )比较命令 C

格式: C [ 源地址范围 ] , [ 目标地址 ]

其中源地址范围是由起始地址和终止地址指出的一片连续的存储单元,目标地址为与源地址所指单元对比的目标地址起始地址。

功能:从源地址范围是由起始的地址单元开始逐个与目标起始地址往后的单元顺序比较每个单元内容,比较到源终止地址为止。比较结果如果一致则不显示任何信息,如果不一致,则以 [ 源地址 ][ 源内容 ][ 目的内容 ][ 目的地址 ] 的形式显示失败单元地址及内容。

( 7 )搜索指定内容命令 S

格式: S [ 地址范围 ][ 表 ]

功能:在指定地址范围内搜索表中内容,搜索到就显示表中元素所在地址。

( 8 )检查和修改寄存器内容命令 R

格式: a · R

b · R [ 寄存器名 ]

功能: a ·显示 CPU 内部所有寄存器的内容和全部标志位的状态。

b ·显示和修改一个指定寄定器的内容和标志位的状态。

其中对状态标志寄存器 FLAG 以位的形式显示,显示时, 8 个状态标志的显示次序和符号如表 B - 1 所示。

表 B - 1 状态标志显示形式

标 志 位

状 态

显示形式(置位 / 复位)

溢出标志 OF

有 / 无

OV/NV

方向标志 DF

增 / 减

DN/UP

中断标志 IF

开 / 关

EI/DI

符号标志 SF

负 / 正

NG/PL

零标志 ZF

零 / 非

ZR/NZ

辅助进位 AF

有 / 无

AC/NA

奇偶标志 PF

偶 / 奇

PE/PO

进位标志 CF

有 / 无

CY/NC

( 9 )跟踪与显示命令 T

格式: a · T[ =地址 ] 或 T [ 地址 ]

b · T[ =地址 ][ 条数 ] 或 T [ 地址 ][ 条数 ]

功能: a ·执行一条指定地址处的指令,停下来,显示 CPU 所有寄存器内容和全部标志位的状态,以及下一条指令的地址和内容。

b ·为多条跟踪命令,从指定地址开始;若命令中用 [ 地址 ] 给定了起始地址,则从起始地址开始,若未给定,则从当前地址( CS:IP )开始,执行命令中的 [ 条数 ] 决定一共跟踪几条指令后返回 DEBUG 状态。

( 10 )反汇编命令 U

格式: a · U [ 地址 ]

b · U [ 地址范围 ]

功能:将指定范围内的代码以汇编 语言形式显示,同时显示该代码位于内存的地址和机器。

若在命令中没有指定地址则以上一个 U 命令的最后一条指令地址的下一个单元作为起始地址;若没有输入过 U 命令,则以 DEBUG 初始化段寄存器的值作为段地址,以 0100H 作为偏移地址。

(11) 命名命令 N

格式: N 文件名

功能:在调用 DEBUG 时,没有文件名,则需要用 N 命令将要调用的文件名格式化到 CS:5CH 的文件控制块中,才能用 L 命令把它调入内存进行调试(其它形式参考 DOS 手册)。

( 12 )读盘命令 L

格式: a · L [ 地址 ][ 驱动器号 ][ 起始扇区号 ][ 所读扇区个数 ]

b · L [ 地址 ]

c · L

功能: a ·把指定驱动器和指定扇区范围的内容读到内存的指定区域中。其中地址是读入内存的起始地址,当输入时没有给定地址,则隐含地址为 CS:100H 。起始扇区号指逻辑扇区号的起始位置。所读扇区个数是指从起始扇区号开始读到内存几个扇区的内容。驱动器号为 0 或 1 , 0 表示 A 盘, 1 表示 B 盘。

b ·读入已在 CS:5CH 中格式化的文件控制块所指定的文件。在使用该命令前用 N 命令命名即可将要读入的文件名格式化到 CS:5CH 的文件控制块中,其中地址为内存地址。

c ·同 b ·地址隐含在 CS : 100H 中。

当读入的文件有扩展名 .COM 或 .EXE ,则始终装入 CS:100H 中,命令中指定了地址也没用。

其中 BX 和 CX 中存放所读文件的字节数。

(13) 写盘命令 W

格式: a · W[ 地址 ][ 驱动器号 ][ 起始扇区号 ][ 所写扇区个数 ]

b · W[ 地址 ]

c · W

功能: a · 把在 DEBUGU 状态下调试的程序或数据写入指定的驱动器中 , 起始扇区号 , 所写扇区个数为要占盘中几个扇区。

写盘指定扇区的操作应十分小心,如有差错将会破坏盘上的原有内容。

如果在命令行中的地址只包含偏移地址, W 命令认为段地址在 CS 中。

b ·当键入不带参数的写盘命令时, ( 或只键入地址参数的写盘命令 ) ,写盘命令把文件写到软盘上。该文件在用 W 命令之前用命名命令 N 将文件格式化在 CS:5CH 的文件控制块中。

c ·只有 W 命令以前而没有任何参数时,与 N 配合使用进行写盘操作。

在用 W 命令以前在 BX 和 CX 中应写入文件的字节数。

( 15 )输出命令 O

格式: O[ 端口地址 ] [ 字节值 ]

功能:向指定端口地址输出一个字节。

( 16 )运行命令 G

格式: G [ =地址 ][ 地址 [ 地址… ]]

功能:执行用户正在调试的程序。

其中地址为执行的起始地址,以 CS 中内容作为段地址,以等号后面的地址为偏移地址。再后面的地址为断点地址。在命令行中只有起始地址,没有断点地址,则程序在执行时不中断。 DEBUG 规定最多设置 10 个断点地址。设置多个断点用于调试较大的程序,即程序中有多个模块、多个通路时用,比较方便,在执行时不论走哪条通路,程序都可以在断点处停下来,以便调整程序。

断点地址为程序中断处的偏移地址,段地址在 CS 中。

当执行在 DEBUG 状态下汇编的小段程序时,只用 G 命令即可。

( 17 )十六进制运算命令 H

格式: H 数据 1 数据 2

其中数据 1 和数据 2 为十六进制数据。

功能:将两个十六进制数进行相加、减,结果显示在屏幕上。

( 18 )结束 DEBUG 返回到 DOS 命令 Q

格式: Q

功能:程序调试完退出 DEBUG 状态,返回到 DOS 状态下。

Q 命令不能把内存的文件存盘,要想存盘必须在退出 DEBUG 之前用 W 命令写盘。

 

版权所有:西北师范大学物电学院电子信息工程系
Tel: 0931-7971503;E-mail: songhs@nwwnu.edu.cn
最佳浏览方式:IE 5.0以上浏览器,1024*768分辨率