xin微机原理与汇编语言程序设计 下载本文

第四节 DEBUG程序调用及汇编语言程序调试方法

调试程序DEBUG是DOS支持的又一种系统软件,主要用于汇编语言程序的调试。汇编和连接过程只能查出源程序的语法错误,不能查出功能上的错误和程序不完善的地方。DEBUG程序为用户提供多种命令,大致有:显示和修改寄存器和存贮单元的内容;执行程序中任意一段或一条指令;汇编单条源语句和反汇编机器码指令;查找字符代码;端口的输入和输出;文件装入内存和写入磁盘等。用户利用这些命令可以查出任何程序功能上的错误。下面说明DEBUG程序的启动方法和主要命令意义。

一、DEBUG程序的启动

DEBUG程序有两种启动方法。DEBUG程序是在DOS盘上的一个独立的可执行程序(扩展名为.COM),所以,DEBUG程序的第一种启动方法就是把它看作和一般的可执行程序一样,只要打入DEBUG和回车键,就可以把它装入内存。但是这样启动只把DEBUG程序本身装入内存并进入等待DEBUG命令状态,还没有把要调试的程序装入内存。第二种启动DEBUG的程序的方法是一次相继装入DEBUG程序和要调试的程序。打入的命令格式如下:

DEBUG[d:][path]filename[.ext][parml]Lparm2]

其中的Filename是要调试程序的文件名,可选项[d:][path]和[.ext]分别是要调试程序的所在盘符、路径和扩展名。可选项[parml]和[parm2]是DEBUG程序为要调试程序准备的参数(一般不用)。

例 进入DEBUG程序并装入要调试程序,要调试程序在A驱动器中。其操作如下:

C>DEBUG A:ABC.EXE (进入DEBUG,并装配ABC.EXE) 此时屏幕上出现一个短线,这表示可以使用DEBUG命令了。

二、调试命令

在说明每个命令之前,先说明一些共同信息:

■ DEBUG命令都是以一个英文字母开头,后面跟一个或多个参数。 ■ 命令字母和参数可用大写或小写或混合形式。

■ 命令字母和参数中,相邻两个十六进制之间必须用逗号或空格分开.其它各部分之间有无空格或逗号都可以。

■ 执行任何命令期间都可用Ctrl+Break键方法结束命令的执行。 ■ 打入命令字母和参数后必须打入回车键才能使命令有效。

■ 如果执行某种命令期间在显示器或打印机上的很长的输出,可以按Ctrl+Numlock键暂停继续显示,使显示屏幕停下来供观察。再按任何其它键,则继续显示输出。

■ 在DEBUG程序状态下,控制键和DOS支持的编辑键继续有效。 ■ 如果输入的命令有错误,将显示出来。例如: dcs:100cs:110 error

这说明d命令的第二个address参数格式不对,它只能包括偏移地址部分,不能再有段地址部分。它发现S不是十六进制数字符。

■ DEBUG程序状态光标提示符为“-”。

5

下面按命令功能相近关系分组说明几个主要命令功能和使用的方法:

(一) 显示和修改寄存器或存贮单元的有关命令

1. R(Register)命令

R命令有三种功能:

? 显示单个寄存器内容并等待修改这个寄存器内容;

? 显示CPU内部的所有寄存器的内容和全部标志位的状态; ? 显示和修改所有标志位的状态。

⑴ 显示和修改单个寄存器内容命令

命令格式:R [寄存器名]

说明:显示单个寄存器内容。R之后输入寄存器名符。例如命令 - RAX↙

将显示出AX的内容和在下一行显示出冒号。 AXF1E4 :-

上面的F1E4是AX的当前内容。如果在冒号后打入要修改的内容,然后打回车键,这时AX即修改为新值;如果不输入新值只打回车键,则不改变原值。

⑵ 显示CPU内部的所有寄存器的内容和全部标志位的状态命令

命令格式:R

说明:显示所有寄存器和标志位值。例如: -R↙

系统响应给出格式如(值是假设的):

AX=0E00 BX=00FF CX=0007 DX=01FF SP=0390 BP=0000 SI=0050 DI=0000 DS=04BA ES=04BA SS=04BA CS=04BA IP=01lA NV UP DI NG NZ AC PE NC

04BA:0HA CD21 INT21

前几行显示的是寄存器内容和8个状态标志位的状态,最后一行显示是下面将要执行的指令地址,它对应的机器码和汇编语句形式。8位状态标志位的状态不是以0或1的形式显示的,而是用两个字母显示的。字母和状态对应关系如表所示: 标志位名 OF(溢出标志) DF(方向标志) IF(中断标志) SF(符号标志) ZF(零标志) AF(辅助进位) PF(奇偶标志) CF(进位标志) 为1对应符 OV DN EI NG ZR AC PE CY 为0对应符 NV UP DI PL NZ NA PO NC

6

⑶ 显示和修改标志位状态的命令 命令格式: RF

系统响应是显示8个状态位。例如:

OV DN EI NG ZR AC PE CY_(最后为光标位置)如果打入回车键,将不改变标志位的状态;也可以打入一个或多个新的状态符,重新设置其状态。输入时各标志的次序无关,输入的各个标志之间可以没有空格。如从光标位置开始打入: PONZDINV

将改变第一、三、五、七个状态位的值。

2.D(Dump)命令

用途:显示某个存储区的内容。 格式:D[address]或D[range]

存储单元的内容用两种方式显示:—种是每一个存储单元的内容(每一字节)用两位16进制数显示;另一种是用相应的ASCII字符显示,句号(.。?)表示不可显示的字符。 ? 如果取命令格式:D

后面无地址或范围参数,将从前次命令显示后的下一个单元开始显示40H字节或80H字节的内容。 ? 如果取命令格式:D [range]

则显示指定地址范围各单元的内容。

3.E(Enter)命令 ’

用途:显示和修改存贮单元的内容。 格式1:E [address] [list]

将内容表包括的数值和字符串的ASCII码依次置入从指定地址开始的存贮单元。例如:

E DS:100 F3“XYZ”8D

从内存单元DS:100H至DS:104H的5个单元中依次置入F3H(1个单元),XYZ的ASCII码(3个单元)和8DH(1个单元)。

格式2:E [address]

显示指定地址单元的内容,并等待输入新的值。 输入新的值过程如下:

输入一个字节的十六进制数,以替换原单元中的内容,然后采取下列三种操作的一种。

(1)按空格键,则上一个替换要求完成,且显示出下一个单元的地址和原有的内容。如果想改变它,可直接输入要修改的值,再按空格键,??,这样,就可以连续地进行修改。若某一单元的内容不需要修改,可直接按空格键。

(2)按“—”号键,将在下一行显示前一单元的地址和内容。如果想改变它,可直接输入要修改的值,然后再按“—”,则又显示前一单元的地址和内容,??,这样就可连续地进行反向修改。若所示的前一单元的内容不需要修改,可直接按“—”键。

(3) 按回车键将结束E命令。

命令参数中[地址]如果不指明段地址,则默认段地址为DS。

7

4.F(File)命令

用途:在指定的存贮地址范围内置入内容表给出的数值或字符代码。 格式:F [range] [list]

说明:如果list包含的字节少于range包括的单元数,则把list的字节重复置入指定的地址区,直到指定的范围都置入新值为止。如果list包含的字节数多于range包括的单元数,则多出的字节被忽略。

如果range参数中不指明段地址,则默认段地址为DS。例如: F4BA:100L5 F3'XYZ'8D

则从04BA:100至04BA:104的5个单元依次装入F3 58 59 5A 8D。

(二)汇编与反汇编命令

1. A(Assemed) 命令

用途:先显示汇编的内存地址,等待用户输入一条助记符指令。用户输入指令并按回车后,DEBUG将把这条指令对应的机器码顺序存放在指定的内存单元中,并提示下一地址,等待用户继续输入下一条指令。若直接按回车,则退出A命令;若在输入指令时语句有错误,则显示出错信息,仍然提示当前的汇编地址,用户可重新输入指令。

格式:A [address]

说明:若没有指定地址,则从“CS:100”单元开始存放。

2.U(Unassemed)命令

用途:对于存贮器内的指令机器码进行反汇编,结果显示的语句和源程序语句会大部分相同,由于不能反汇编出标号、标识符等信息,所以与源程序语句有些差别。但在调试程序时,这个命令常常用于对照机器码指令与源程序是否一致。 格式:U[address]或U[range]

说明:反汇编过程产生的输出包括指令的开始地址,指令的机器码和指令的源语句。

例:-U:从当前地址开始反汇编 也可以从某个地址处开始反汇编

例:-U 200:从CS:200处开始反汇编

(三)运行命令

1.G(Go)命令

用途:执行正在调试的程序。

格式:G[=address][address[address?]]

说明:等号及第一个address参数指明程序执行的起点。后面的一个或多个address参数是设定的断点。这个命令可取以下三种格式: (1)G不打入任何参数。这时从当前指令,即从CS:IP指定的地址开始执行,并一直执行下去。

(2)G=address打入等号和程序执行的起始地址。程序开始执行后一直执行下去。

(3)G[=address]address[address?]。这种格式意味着起始地址可取(1)

8