本文介绍 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 查看寄存器
- 数据寄存器:
AX
、BX
、CX
,DX
- 地址寄存器:
SP
、BP
、SI
、DI
- 段寄存器:
DS
、ES
、SS
、CS
- 控制寄存器:
IP
和FLAGS
(在上图中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 下。