当前位置: 代码迷 >> 综合 >> 【Computer Science】【8086汇编】DEBUG介绍
  详细解决方案

【Computer Science】【8086汇编】DEBUG介绍

热度:56   发布时间:2023-12-06 13:18:35.0

本文介绍 8086 汇编中 debug 命令的使用.

文章目录

      • 1. 进入 DEBUG
      • 2. 常用命令用法
        • 2.1 R 命令——查看和修改寄存器
          • 2.1.1 查看寄存器
          • 2.1.2 修改寄存器
        • 2.2 D 命令——查看内存单元
        • 2.3 E 命令——修改内存单元
        • 2.4 U 命令 ——反汇编
        • 2.5 A 命令——输入汇编指令
        • 2.6 T/P 命令——单步执行
        • 2.7 G 命令——连续执行程序
        • 2.8 Q 命令 ——退出 DEBUG

1. 进入 DEBUG

打开 CMD,进入 DEBUG

在这里插入图片描述

DEBUG 命令有 20 多个,我们主要学习最常用的命令。

  • R ——查看和修改寄存器
  • D ——查看内存单元
  • E ——修改内存单元
  • U ——反汇编,将机器指令变为汇编指令
  • T / P ——单步执行
  • G ——连续执行程序
  • A ——输入汇编指令
  • Q ——退出

2. 常用命令用法

2.1 R 命令——查看和修改寄存器
2.1.1 查看寄存器

在这里插入图片描述

  1. 数据寄存器:AXBXCXDX
  2. 地址寄存器:SPBPSIDI
  3. 段寄存器: DSESSSCS
  4. 控制寄存器: IPFLAGS(在上图中 FLAGS 的值为 NV UP EI PL NZ NA PO NC
0ADE:0100 B8BA0D        MOV     AX,0DBA
  • 0ADE:0100:地址
  • B8BA0D:机器指令
  • MOV AX,0DBA:汇编指令
2.1.2 修改寄存器
-R AX
AX 0000
:1234

在这里插入图片描述
在这里插入图片描述

2.2 D 命令——查看内存单元

内存每 16 个字节单元为一小段,逻辑段必须从小段的首址开始。用 D 命令可以查看存储单元的地址和内容。

D 命令格式为:

D  段地址:起始偏移地址 [结尾偏移地址] [L范围]

例如:

D DS:0      查看数据段,从 0 号单元开始
D ES:0        查看附加段,从 0 号单元开始
D DS:100    查看数据段,从 100H 号单元开始
D 0200:5 15     查看 0200H 段的 5 号单元到 15H 号单元(在虚拟机上该命令不能执行)
D 0200:5 L 11   用 L 选择范围。查看 0200H 段的 5 号单元到 15H 号单元共 17 个单元

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中左边一列为逻辑地址,中间部分为存储单元的内容。每行为 16 个字节单元,中间的小横线用于区分前 8 个单元和后 8 个单元。在逻辑地址中只给出每行第一个单元的偏移地址,其余 15 个单元的偏移地址没有标出。可以推断出图中第一行单元的偏移地址从 0000H 到 000FH,第二行单元的偏移地址为 0010H~001FH,以此类推。右边部分显示出内存单元中的 ASCII 码表示的字符,无法显示时用小点代替。

图中第一条 D 命令显示的是数据段存储单元的内容,可以看到数据段的段地址为 DS,其值 0B05H。0 号单元的内容为 CDH,1 号单元为 20H ,…,第 15 号单元的内容为 03H;第二行 0010H 号(16 号)单元的内容为 69H,它是小写字母 i 的 ASCII 码,因此右边区域中显示了 i ,表示该单元的值 69H 可以看成 ASCII 码。

第二条 D 命令显示 0200H 段中的内容,也是从 0 号单元开始。

第三条 D 命令从 0200H 段的 5 号单元开始显示直到 15H 号单元。

如果在 D 后面直接写出偏移地址,则显示当前数据段下偏移地址开始的内存单元,如:

D 10        从数据段10H号单元开始显示
D100    从数据段100H号单元开始显示

在这里插入图片描述
在这里插入图片描述

注意:多次键入 D,可连续显示后面的单元内容。

2.3 E 命令——修改内存单元

用 E 命令可以改写多个存储单元的内容。
E 命令格式为:

E 起始地址 修改值 修改值 ...
-D DS:3 5
0ADE:0000           9F 00 9A                                    ...
-E DS:3 14 15 16
-D DS:3 5
0ADE:0000           14 15 16                                    ...

在这里插入图片描述
如果 E 后面直接跟偏移地址,则修改当前数据段下偏移地址所指单元值;还可以用 E 命令修改其它段的存储单元内容。

E 10        修改当前数据段10H号单元内容

在这里插入图片描述
在这里插入图片描述

E ES:100    修改附加段100H号单元内容
D ES:100 L 1      查看一下100H单元的内容是否修改了

在这里插入图片描述

2.4 U 命令 ——反汇编

程序员编写的汇编语言源程序经过汇编(编译)后生成了二进制的机器指令代码,而 U 命令可将二进制的机器指令变为助记符形式的汇编指令,因此称之为“反汇编”。通过 U 命令,我们可以得到机器指令与汇编指令的对照,了解机器指令的存储情况,如图所示.
在这里插入图片描述

左边为代码段中存储单元的逻辑地址,段地址 CS 的值为 0ADEH,偏移地址从 0100H 开始。紧靠偏移地址的一列为机器指令代码,右边部分是机器指令对应的汇编指令。例如第一行中,机器指令为 7419H,它对应的汇编指令为 JZ 011B,该指令是条件转移指令,表示当结果为 0 时跳转到偏移地址 011BH 单元中的指令继续执行。

注意:多次键入 U,可连续显示后面的程序部分。

U 后跟偏移地址,则从该地址开始反汇编。如:

U 0       从代码段0号单元开始反汇编
U100     从代码段100H号单元开始反汇编

需要注意的是,图 2-22 中显示的程序代码并不是用户编写的程序,因为在输入 DEBUG 命令时没有写用户程序名.EXE。这段程序代码是系统代码段中保存的内容,有可能是系统程序,也有可能是无效的代码。

2.5 A 命令——输入汇编指令

在 DEBUG 中,使用 A 命令可以输入汇编指令,系统自动地将键入的汇编指令翻译成机器代码,并相继地存放在从指定地址开始的存储区中。由于 DEBUG 下的数值默认为十六进制数,因此先要将十进制数转换成十六进制数。

例如,计算 Z = 35 + 27 的汇编指令为:

MOV  AX,23
ADD  AX,1B
MOV  [0000],AX

加法的结果 Z=62=3EH。变量 Z 用存储单元[0000]表示。这三条指令可在 DEBUG 下用 A 命令直接输入。输入 A 命令后,系统自动地给出逻辑地址为 0AEE:0100(CS:偏移地址),在其后输入汇编指令,回车后可输入下一条指令,直接回车则退出输入。

操作过程如下:
在这里插入图片描述

也可以在 A 命令后给出指令的存放地址,如 A CS:0000,表示从代码段的 0 号单元开始存放输入的指令。

2.6 T/P 命令——单步执行

输入完指令后,应该执行它。T 命令可以一条一条地执行指令。P 命令的作用与 T 命令相同,当遇到中断指令 INT n 和调用指令 CALL 时,应该使用 P 命令,以确保程序正常执行。这是因为 INT n 指令和 CALL 指令都要转移到子程序去执行,T 命令进入子程序后可能无法返回;而 P 命令则直接执行该指令,并将结果带回。遇到循环指令 LOOP 时也应该使用 P 命令,可以使循环快速结束。

本次执行前,先用 R 命令查看指令指针寄存器 IP 的值是否为 0100,如果不是,用 R IP 命令修改为 0100。表示现在要从 CS:0100 单元开始执行指令。T 命令每执行一次,都要显示当前寄存器的状况,我们可以随时了解指令的执行情况。计算 Z = 35 + 27 的汇编指令的执行过程如下图所示。
在这里插入图片描述
查看执行结果:第一次执行 T 命令后,AX 寄存器的值改为 0023,第二次执行后,AX 的值变成 003E 了,说明已经执行完加法 ADD 指令了,第三次执行 T 后,寄存器的值并未发生变化,说明第三条指令没有对寄存器操作。第三条指令 MOV [0000],AX 是把结果保存到数据段的存储单元 0 号字单元中,用 D DS:0 命令查看该单元的值已经为 003EH 了(两个字节单元为一个字单元)。

T 命令还可以连续执行多条指令。如上例中连续执行 3 条指令,可用如下 T 命令:

-T 3

T 命令也可以设置开始地址和执行条数。如上例中从 0100H 开始连续执行 3 条指令,可用如下 T 命令:

-T =0100  3
2.7 G 命令——连续执行程序

有关连续执行命令 G 的用法我们放到后面章节中学习。

2.8 Q 命令 ——退出 DEBUG

键入 Q,回车后退出 DEBUG,返回到 DOS 下。

  相关解决方案