DEBUG用法详细说明

  = 专题 =
  DEBUG

 

调试程序DEBUG的特点:

    在受控环境中测试程序;

    装入,显示或修改任何文件;

    执行DOS程序;

    完成磁盘实际读/写操作;

    建立或汇编汇编语言程序。

 

DEBUG的命令格式: DEBUG  [drive:][path][filename][.ext][param...]

其中:

    drive:  DEBUG将要调试的文件所在的磁盘驱动器。

    path 是查找DEBUG将要调试的文件所需的子目录路径,若未指定,DOS使用当前目录。

    filename[.ext] DEBUG将要调试的文件名。

    param  是将被调试的程序(或文件)的命令行参数。

附:

    DEBUG所完成的初始化动作,假定文件名没有,启动DEBUG

    段寄存器CSDSESSS置为DEBUG程序后的第一个段。

    指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句)。

    堆栈指针SP置为段末或COMMAND.COM暂驻部分的结束地址(其中较小的那个地址)。

    其余通用寄存器均置为0,标志寄存器置为下述状态: NV    UP    EI    PL    NE    NA    PO    NC

    如果DEBUG命令行含有文件名,段寄存器DSES指向PSP。寄存器BXCX含有程序长度。

 

 

DEBUG使用单字符命令:

命令 格式 命令 格式
汇编 A [地址] 命名 N [设备:][路径]文件名[.扩展名]
比较 C [范围] 输出 O 口地址
转出 D [范围][地址] 继续执行 P [=地址][]
键入 E 地址[] 退出 Q
填入 F 范围表 寄存器 R [寄存器]
执行 G [=地址][地址[地址...]] 搜索 S 范围表
十六进制 H   跟踪 T [=地址][范围]
输入 I 口地址 反汇编 U [地址][范围]
装入 L [地址][设备扇区,扇区]] W [地址[设备扇区,扇区]]
移动 M 范围  地址    

 

显示存储单元的命令D(DEBUG),格式为:

- D  [address]    - D[range]

例如,按指定范围显示存储单元内容的方法为:

-D 100 120
067C:0100 
C7 D7 0D 0A 32 33 33 34 - D5 C5 B4 C6 30 10 42 0C  ....2334....0.B.
067C:0110 
03 41 42 43 44 45 46 47 - 48 49 4A 4B 4C 4D 4E 4F  .ABCDEFGHIJKLMNO
067C:0120 
8B

说明:

    其中01000120DEBUG显示的单元内容。 左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,“.”表示不可显示的字符。这里没有指定段地址, D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令的最后一个单元的内容。

    计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数:01。每8位组成一个字节,位编号如下所示:

7

6

5

4

3

2

1

0

    在存储器里以字节为单位存储信息。为了正确地存放或取得信息,每一个字节单元给以一个存储器地址。地址从0开始编号,顺序地每次加1。在机器里,地址也是用二进制数来表示的。它是无符号整数,书写格式为十六进制。

    16位二进制可以表示216次方个字节单元的地址,它可表示的地址范围应该是0-65535。为方便,存储器的容量以210次方=1024为基本单位,称为1K。这样,65536个字节单元的存储容量就是64K,其地址编号的范围用16进制数表示为0-FFFFH。如下所示。

000000010002………………0009000A000B000C000D000E000F
001000110012………………0019001A001B001C001D001E001F
002000210022………………0029002A002B002C002D002E002F
……

……

FFE0FFE1FFE2………………FFE9FFEAFFEBFFECFFEDFFEEFFEF
FFF0FFF1FFF2………………FFF9FFFAFFFBFFFCFFFDFFFEFFFF

    一个字存入存储器要占有相继的二个字节,存放时,低位字节存入低地址,高位字节存入高地址,以相反的次序存入的。

    存储器的特点:它的内容是取之不尽的。从某个单元取出其内容后,该单元仍然保存着原来的内容不变,可以重复取出,只有存入新的信息之后,原来保存的内容自动丢失。

 

 

☆修改存储单元内容的命令有两种

输入命令EEnter),有两种格式如下:

第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:

-E  address  [list]

例如,-E  DS:100   F3'XYZ'8D

其中F3‘X’‘Y’‘Z’8D各占一个字节,该命令可以用这五个字节来替代存储单元DS01000104的原先的容。

 

第二种格式则是采用逐个单元相继修改的方法。命令格式为:

-E  address

例如,-E  CS:100

则可能显示为:

18E40100   89. -

如果需要把该单元的内容修改为78,则可以直接键入78,再按空格键可接着显示下一个单元的内容,这样可以不断修改相继单元的内容,直到Enter键结束该命令为止。

 

填写命令FFill),其格式为:

-F  range   list

例如,-F  4BA:0100   5  F3'XYZ'8D

使04BA0100-0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定范围,则重复使用list填入,直到填满指定的所有单元为止。

  

☆检查和修改寄存器内容的命令R(Register),它有三种格式如下:

显示CPU内所有寄存器内容和标志位状态,其格式为:

-R

        AX=0000  BX=0000  CX=010A  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
        DS=18E4  ES=18E4  SS=18E4  CS=18E4  IP=0100     NV UP DI PL NZ NA PO NC
        18E4
0100  C70604023801    MOV    WORD PTR[0204]0138    DS:0204=0000

其中标志位状态的含义可见下表:

   

标志为1

标志为0

OF

DF

IF

SF

ZF

AF

PF

CF

溢出(是/否)

方向(减量/增量)

中断(允许/关闭)

符号(负/正)

零(是/否)

辅助进位(是/否)

奇偶(偶/奇)

进位(是/

OV

DN

EI

NG

ZR

AC

PE

CY

NV

UP

DI

PL

NZ

NA

PO

NC

显示和修改某个寄存器内容,其格式为:

-R  register_ name

例如,键入

-R  ax

系统将响应如下:

AX  F1F4

AX寄存器的当前内容为F1F4,如不修改则按Enter键,否则,键入欲修改的内容如:

-r  bx
BX  0369
059F

则把BX寄存器的当前内容修改为059F

 

显示和修改标志位状态,命令格式为:

-RF

系统将响应,如:

OV DN EI NG ZR AC PE CY -

此时如不修改其内容可按Enter键,否则,建入欲修改的内容,如:

OV DN EI NG ZR AC PE CY - PONZDINV

即可,键入的顺序是任意的。

 

☆运行命令G(Go),其格式为:

-G  [=address1][address2[address3  ...]]

        其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。

  

 

☆输入命令I(IN),其格式为:

-I  PortAddress

        显示指定端口地址的内容

 

☆输出命令O(OUT),其格式为:

-O  PortAddress    NewValue

       修改指定端口地址的内容

 

☆跟踪命令T(Trace),有两种格式:

逐条指令跟踪

 -T[=address]

从指定地址起执行一条指令后停下来,显示所有寄存器内空及标志位的值。如未指定则从当前的CS:IP开始执行。

 

多要指令跟踪

-T[=address][value]

从指定地址起执行n条指令后停下来,nvalue指定。

 

 汇编命令A(Assemble),其格式为:

-A [address]

        该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D

  

反汇编命令U (Unassemble), 有两种格式:

从指定地址开始,反汇编32个字节,其格式为:

 -U[address]

例如:

-u 100

18E4:0100   C70604023801    MOV    WORD  PTR[0204],0138
18E4:0106   C70606020002    MOV    WORD  PTR[0206],0200
18E4:010C   C70608020202    MOV    WORD  PTR[0208],0202
18E4:0112   BB0402          MOV    BX,0204
18E4:0115   E80200          CALL   011A
18E4:0118   CD20            INT    20
18E4:011A   50              PUSH   AX
18E4:011B   51              PUSH   CX
18E4:011C   56              PUSH   SI
18E4:011D   57              PUSH   DI
18E4:011E   8B37            MOV    SI,[BX]

如果地址被省略则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。

 

对指定范围内的存储单元进行反汇编,格式为:

-U[range]

例如:

-u 100  10C

18E4:0100   C70604023801    MOV  WORD PTR[0204],0138
18E4:0106   C70606020002    MOV  WORD PTR[0206],0200
18E4:010C   C70608020202    MOV  WORD PTR[0208],0202

-u 100  112

18E4:0100   C70604023801    MOV  WORD PTR[0204],0138
18E4:0106   C70606020002    MOV  WORD PTR[0206],0200
18E4:010C   C70608020202    MOV  WORD PTR[0208],0202

这两种格式是等效的。

 

命名命令N(Name),其格式为:

-N  filespecs  [filespecs]

命令把两个文件标识符格式化在CS5CHCS6CH的两个文件控制块中,以便在其后用LW命令把文件装入或存盘。

filespecs的格式可以是:[d:][path]  filename[.ext]

例如:

-N  myprog

-L

-可把文件myprog装入存储器。

 

☆装入命令L(Load), 有两种功能:

把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:

-L  [address  drive  sector  sector_num]

L命令只能读入逻辑扇区,不能读取MBR. 其中, 第一个参数是读入到的地址, 第二个参数是盘号(0=A,1=B,2=C,...), 第三个参数是起始逻辑扇区(从0开始编号的,引导扇区在最开始), 第四个参数是读入的扇区的个数.

 

装入指定文件,其格式为:

-L [address]

此命令装入已在CS5CH中格式化了的文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。

 

☆写命令W(Write),有两种功能:

把数据写入磁盘的指定扇区。其格式为:

-W   address   drive   sector  sector

 

把数据写入指定的文件中。其格式为:

-W  [write address]

利用R命令在BX CX (CX为低字,BX为高字)中存入程序段的长度(字节数),可以利用R BX R CX 要写入文件的修改长度.此命令把指定的存储区中的数据写入由CS5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS: 0100开始。要写入文件的字节数应先放入BXCX中。

 

☆退出DEBUG命令Q(Quit),其格式为:

-Q

它退出DEBUG,返回DOS。本命令无存盘功能,如需存盘应先使用W命令。


你可能感兴趣的:(汇编语言)