网站首页/技术开发列表/内容

[基础知识]Debug 运用简介

技术开发2022-07-19阅读
  • 调试程序DEBUG的特点:
    1. 在受控环境中测试程序;
    2. 装入,显示或修改任何文件;
    3. 执行DOS程序;
    4. 完成磁盘实际读/写操作;
    5. 建立或汇编汇编语言程序。
  • DEBUG的命令格式:
  • [drive:][path] DEBUG [d:][p][filename][.ext][param...]

    其中:

    drive:  是指定DEBUG文件的磁盘驱动器标识符,DEBUG是外部DOS命令,所以必须把它从磁盘读入内存。若未指定,DOS将使用当前默认磁盘驱动器。

    path:  是DOS查找DEBUG文件的一个子目录串表示的路径。若未指定,DOS将使用当前工作目录。

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

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

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

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

    附:

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

    • 段寄存器CS、DS、ES和SS置为DEBUG程序后的第一个段。
    • 指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句)。
    • 堆栈指针SP置为段末或COMMAND.COM暂驻部分的结束地址(其中较小的那个地址)。
    • 其余通用寄存器均置为0,标志寄存器置为下述状态。
    •     NV    UP    EI    PL    NE    NA    PO    NC

        如果DEBUG命令行含有文件名,段寄存器DS和ES指向PSP。寄存器BX和CX含有程序长度。

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

    这些DEBUG命令主要参考清华大学计算机系列教材IBM-C汇编语言程序设计》一书。

     ☆  显示存储单元的命令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

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

        这里顺便提一下存储器及其地址的分段。

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

    76543210

        正当MS-DOS盛行的时候,PC机的字长为16位,由2个字节组成,位编号如下所示:
    1514131211109876543210
                    
    字节7654321076543210
    高位字节  MSB低位字节  LSB
    在存储器里以字节为单位存储信息。为了正确地存放或取得信息,每一个字节单元给以一个存储器地址。地址从0开始编号,顺序地每次加1。在机器里,地址也是用二进制数来表示的。它是无符号整数,书写格式为十六进制。

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

    0000,0001,0002,……,……,……0009,000A,000B,000C,000D,000E,000F,
    0010,0011,0012,……,……,……0019,001A,001B,001C,001D,001E,001F,
    0020,0021,0022,……,……,……0029,002A,002B,002C,002D,002E,002F,
    ……

    ……

    FFE0,FFE1,FFE2,……,……,……FFE9,FFEA,FFEB,FFEC,FFED,FFEE,FFEF,
    FFF0,FFF1,FFF2,……,……,……FFF9,FFFA,FFFB,FFFC,FFFD,FFFE,FFFF。

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

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

    存储器地址的分段:

        前面已经提到16位字长的机器可以访问最大存储空间为64K字节,而PC机的最大存储容量为1M(原MS-DOS操作系统下)。要访问1M字节空间的存储器必须有20位地址,用16进制数表示1M字节的地址范围应该为00000-FFFFF。

        在1M字节的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。CPU访问存储器时,必须先确定所要访问的存储单元的物理地址才能取得(或存入)该单元的内容。20位物理地址由16位段地址和16位偏移地址组成,段地址是指每一段的起始地址,由于它必须是小段的首地址,所以其低4位一定是0,这样就可以规定段地址只取段起始地址的高16位值。偏移地址则是指在段内相对于段起始地址的偏移值。这样,物理地址的计算方法如下:

        把段地址左移4位再加上偏移地址值就形成物理地址。或写成:  16dX段地址+偏移地址=物理地址

        每个存储单元只有唯一的物理地址,但它却可由不同的段地址和不同的偏移地址组成。

        在PC机中,有四个专门存放段地址的寄存器,称为段寄存器。它们是代码段CS(Code Segment)、数据段DS(Data Segment)、堆栈段SS(Stack Segment)和附加段ES(Extra Segment)寄存器。每个段寄存器可以确定一个段的起始地址,而这些段则各有各的用途。代码段是存放当前正在运行的程序。数据段存放当前运行程序所用的数据,如果程序中使用了串处理指令,则其源操作数也存放在数据段中。堆栈段定义了堆栈的所在区域,堆栈是一种数据结构,它是一个比较特殊的数据段。附加段是附加的数据段,它是一个辅助的数据区,也是串处理指令的目的操作数存放区。还有四个通用数据寄存器AX、BX、CX、DX;四个指针及变址寄存器SP、BP、SI、DI;控制寄存器包括IP(指令指针寄存器)和PSW程序状态字寄存器。这些将专门开辟一页详加介绍。

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

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

        -E  address  [list]

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

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

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

        -E  address

        例如,-E  CS:100

        则可能显示为:

        18E4:0100   89. -

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

        -F  range   list

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

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

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

        -R

        例如,

        -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),其格式为:
    其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
      ☆   跟踪命令T(Trace),有两种格式:

        -T[=address]

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

        -T[=address][value]

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

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

        -A [address]

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

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

        -U[range]

        例如:

        -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]

        命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入或存盘。filespecs的格式可以是:

        [d:][path]  filename[.ext]

    例如:

        -N  myprog

        -L

        -

        可把文件myprog装入存储器。

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

    -L[address [drive  sector  sector]]

    -L[address]

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

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

    -W address drive sector sector

    -W [address]

        此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。

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

    -Q

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

    ……

    相关阅读