汇编语言入门教程(三):初识Debug

什么是Debug?Debug是DOS、Windows提供的8086程序调试工具,可以查看CPU各种寄存器的内容,内存情况和机器码级跟踪程序的运行。

Debug一共有20多个命令,但我们在目前为止会使用到Debug的6个命令:

  1. R命令:查看、改变寄存器的内容
  2. D命令:查看内存中的内容
  3. E命令:改写内存中的内容
  4. U命令:将内存中的机器指令翻译成汇编指令
  5. T命令:执行一条机器指令
  6. A命令:以汇编指令的格式向内存中写入一条机器指令

1.Windows下的Debug

在Windows下自带提供了Debug,可以直接通过Window提供的DOS进入到Debug,可以通过开始命令,输入cmd然后进入到DOS界面后直接输入Debug后就进行Debug程序了。

2.Mac下的Debug

在Mac下,你需要通过Boxer这个程序来模拟DOS环境,打开后类似于这样的界面:

Boxer界面

点击Open a DOS prompt后就会弹出如下的界面,可以在这个环境下使用任何的DOS界面:

Boxer DOS界面

但是这个DOS环境只包含了最基础的DOS环境,所以这个DOS环境是不带Debug程序的,你需要下载一个Debug程序或者下载由我提供的一个学习汇编需要的程序包,然后解压后把这个文件夹拖放进DOS窗口后,你就会看见Boxer提供的DOS环境会自动把这个目录加载成C盘,这样就可以正常使用Debug程序了,类似于下图这样:

载入Debug程序

进入界面后,你会看见一个”-“后面跟着闪烁的下划线,说明已经进入Debug。

3.R命令

R命令有两个作用:

  1. 查看当前CPU的各个寄存器状态、以及当前CS、IP指向的代码以及机器指令翻译后的汇编指令。
  2. 修改各个寄存器的内容

输入r后,会返回当前CPU的各个寄存器状态,就如下图这样:

r命令

如果需要修改某个寄存器的内容,可以通过r命令后跟一个寄存器的命令,比如r ax,输入后会返回一个ax当前寄存器的内容,然后会有一个提示符:等待输入,比如下图中,通过r ax命令设置ax的内容为1000H:

r命令设置ax

4.D命令

通过下面的格式可以查看需要的内容中的内容:

d 段地址:偏移地址

比如下图用d命令查看内容20000H处的内容:

d命令查看20000H

返回的内容中包含了三个显示部分:

  • 第一部分位于最左边类似于2000:0000,是每行开始的第一个内存单元的段地址和偏移地址。
  • 第二部分位于中间的十六进制编码,是开始部分的内存单元一直显示128个内存单元的内容,而每行等于16个字节,注意在每行在第八个内存单元的后面会有一个-来分割,有利于我们辨识。
  • 第三部分位于最右边,是每个内存单元中的数据可以对应显示的ASCII,如果没有对应的ASCII码,就会用.代替。

还有一种限制D命令输出的方式,可以通过使用结束偏移地址来限制D命令的返回结果,它的格式为:

d 段地址:偏移地址 结束偏移地址

比如下图中只需要返回内存地址为2000:0000到2000:0009的十个内存单元的内容:

返回0-9内存单元

5.E命令

e 段地址:偏移地址

可以通过E命令来改写内存中的内容,不管是汇编指令还是数据。

通过E命令可以连续更改也可以更改一个内存单元,当修改指定内存单元的内容时,会把当前内存单元的内容显示出来,然后用一个.号连接需要写入的数据,比如需要修改内存单元20000H的内容为10,然后再用d命令查看修改后的内容:

修改20000H

当然也可以连续修改指定内存单元后的连续内存单元中的内容,只需要在输入需要写入的内存单元后按空格间,会自动跳到下一个内存单元进行修改,直到按回车键,就会写入内存:

连续写入

6.U命令

u命令会将某一段内存单元中的内容翻译成汇编指令,并返回16个内存单元的内容,返回的内容中包含三部分:

  1. 每一条机器指令的地址
  2. 对应的机器指令
  3. 对应的汇编指令

比如查看内存单元2000:0000的数据,并翻译成汇编指令:

u命令

当然也可以限制返回的内容,比如下面返回内存单元2000:0000到内存单元2000:0009的汇编指令:

0-9

这里需要注意的是在计算机中储存在内存单元中的不管是数据还是代码,都是以二进制形式储存的,所以是代码还是数据,得看程序员怎么去控制。

7.T命令

T命令是执行当前CS和IP指向的内存单元中的汇编指令,执行后IP自动增加代码长度并正确的指向到下一个代码的内存单元:

t命令

8.A命令

以汇编指令的方式写入到内存单元,格式为:

a 段地址:偏移地址

当指定修改某一个内存单元的内容时,会显示出当前修改的内存单元地址,并等待输入汇编指令,当输入完成后会自动跳到上一条代码长度后的内存单元继续等待输入,如果不想继续写入汇编指令,按回车键就结束写入。

比如下图中,通过在内存单元20000H处以汇编指令形式写入:

mov ax,20

并通过u命令查看内存单元20000H处是否写入成功:

u2000H

并且再通过r命令查看当前AX寄存器的内容,然后修改CS和IP寄存器,让CPU代码指针指向20000H处

rax

然后用t命令执行,再次查看AX寄存器的结果:

tax

文档信息