8086汇编 DEBUG命令详解


   DEBUG是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
   笔者使用DOSBOX进行一些DEBUG指令的演示

DEBUG程序的启动

1.没有文件名,直接打开DEBUG

C:>DEBUG

段寄存器CS、DS、ES和SS置为DEBUG程序后的第一个段。指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句)。 堆栈指针SP置为段末或COMMAND.COM暂驻部分的结束地址(其中较小的那个地址)。
2.对指定可执行文件进行 DEBUG

C:>DEBUG NAME.EXE

DEBUG主要命令

1.汇编命令 A

使用格式 -A[地址]:由使用者输入汇编语句,DEBUG负责将它们汇编成机器代码相继存放在从指定地址开始的存储器中。
eg1.1
(这里DEBUG将我的四个汇编语句存在了内存中地址从 163B:1000 开始的几个字节中,前两句汇编语句都占了3个字节,加法语句占2个字节,最后一句汇编语句占了3个字节)

2.反汇编命令 U

(1)格式:-U [地址]该命令从指定地址开始,反汇编 (指把机器代码翻译成汇编语句)32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。
eg2.1
反汇编了内存中163B:1000开始的32个字节的机器代码,得到的前四条语句即先前笔者使用-A命令汇编的四条汇编指令
eg2.2
(取这段地址是因为DEBUG OUTPUT.EXE时发现代码段CS的地址就是从076D:0000,和本文末尾的output.asm中的源代码比较一下,已经成功的把我的源代码在汇编过程得到的机器代码反汇编成了汇编指令

(2)第二种格式:-U [地址范围] 对该地址范围中的机器代码进行反汇编

在这里插入图片描述

3.运行命令 G

格式 -G 地址 显示执行到该地址时寄存器中的内容(相当于断点调试
在这里插入图片描述
在这里插入图片描述
这里我们还是调试OUTPUT.EXE,首先使用-R命令检查初始时的寄存器内容,我们现在只关注AX,DS寄存器,开始AX=FFFF,DS=075C,然后使用-G命令运行到076D:0003断点,此时AX=076C,DS=075C,这是因为程序至此已经将076C传送给AX寄存器,但还没有进行‘MOV DS,AX’ ,我们再使用-G命令运行到0005断点,此时DS=AX=076C,所以说这里-G起到了断点调试的效果

4.追踪命令 T

(1)逐条指令追踪:-T[=地址] 从该地址开始执行一条指令停下来检查寄存器状态
在这里插入图片描述
从076D:0000 开始执行一条指令后,我们的寄存器状态如上图所示
(2)多条指令追踪:-T[=地址][值] 该命令从指定地址起执行n条命令后停下来,n由[值]确定。
在这里插入图片描述
从076D:0000 开始执行5条指令后,我们的寄存器状态如上图所示,笔者注意到,这里完成第五条指令‘MOV AX ,02’后,AX并不是变成0002,而是从076C变成了026C,这是需要注意的

5.显示内存单元内容 D

格式为 -D[地址]或-D[范围]
在这里插入图片描述
(OUTPUT.EXE的数据段寄存器DS=076C,所以我们检查这一部分内存单元的内容,这里‘123ABC’,是我们程序中在数据段定义的数据)

6.修改内存单元内容 E

(1)批量修改,-E 地址 内容表 将指定地址开始的内存单元中的内容替换成内容表中的内容:
在这里插入图片描述
(这里我们修改了数据段中的从076C:0010开始的几个字节的内容,其中1C ,8D ,‘H’,‘E’,‘L’,‘L’,‘O’各占一个字节,也就是说我们替换了076C:0010至0016总共7个字节的内容)

(2)单个修改,-E 地址
在这里插入图片描述
(这里我们修改了数据段中的从076C:0016这一个字节中的内容,把它从‘O’修改成了‘P’)

7.检查和修改寄存器内容 R

(1)显示CPU内部所有寄存器内容和标志位状态:
在这里插入图片描述
参照下面的表,当前CPU标志寄存器中的含义为 OF=‘无溢出 ’DF=‘增量方向’IF=‘允许中断’ SF=‘正号’ZF=‘非零’ AF= ‘无辅助进位 ’PF=‘奇’CF= ‘无进位’

标志位含义表
标志名 置位 复位
溢出Overflow(是/否) OV NV
方向Direction(减量/增量) DN UP
中断Interrupt(允许/屏蔽) EI DI
符号Sign(负/正) NG PL
零Zero(是/否) ZR NZ
辅助进位Auxiliary Carry(是/否) AC NA
奇偶Parity(偶/奇) PE PO
进位Carry(是/否) CY NC

(2)显示和修改指定寄存器的内容:
-R 寄存器名
例如打入:-R AX
系统将可能响应如下:(当AX中值为FIF4时)
      AX FIF4
表示AX当前内容为F1F4,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,
如: -R BX
      BX 0369 :059F
则BX内容由0369改为059F
在这里插入图片描述
显示AX内容,按回车结束,不做修改
在这里插入图片描述
在这里插入图片描述
显示BX内容,并将其修改为002B

(3)显示和修改标志位状态:(标志位含义参见上文中的‘标志位含义表’)
      -RF
系统将给出响应,如
      OV DN EI NG ZR AC PE CY-
这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如
      OV DN EI NG ZR AC PE CY-PO NZ DI NV

在这里插入图片描述
在这里插入图片描述
修改了OF,将OF置位

8.命名命令 N

-N 文件名
此命令将文件名格式化在CS:5CH的文件控制块内,以便使用L或W命令把文件装入内存进行调试或者存盘。

9.装入命令 L

      存盘。
(1)把磁盘上指定扇区的内容装入到内存指定地址起始的单元中,格式为:
      -L 地址 驱动器 扇区号 扇区数
(2)装入指定文件,格式为:
      -L [地址]
此命令装入已在CS:5CH中格式化的文件控制块所指定的文件。在用L命令前,BX和CX中应包含所读文件的字节数。

10.写命令 W

(1)把数据写入磁盘的指定扇区:
      -W 地址 驱动器 扇区号 扇区数
(2)把数据写入指定文件中:
      -W [地址]此命令把指定内存区域中的数据写入由CS:5CH处的FCB所规定的文件中。在用W命令前,BX和CX中应包含要写入文件的字节数。

11.退出命令 Q

退出DEBUG,该指令退出DEBUG程序,返回DOS,但该命令本身并不把在内存中的文件存盘,如需存盘,应在执行Q命令前先执行写命令W。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章