Debug 是什么
Debug 是 Windows / Dos 操作系统提供的一种功能。使用 Debug 能让我们方便查看 CPU 各种寄存器的值、内存情况,方便我们调试指令、跟踪程序的运行过程。
接下来我们会用到很多 debug 命令,但是使用这些命令的前提是,你需要在电脑上安装一下 debug,Windows/Mac 都可以安装,获取链接我已经给你找出来了。阿,忘记说了,我们这里使用的是 Dos box来模拟汇编的操作环境。
传送门(Mac 和 Windows 都是):https://www.dosbox.com/download.php?main=1
下载完成后打开 DosBox ,打开之后是这样的。
此时我们输入 debug 命令应该提示的是
因为我们还没有进行连接和挂载,此时我们执行
mount c D:\debug
执行这条命令时,你需要现在 D 盘下创建一个 debug 文件夹,然后我们挂载到 debug 下面。
并且执行 C:
切换到 C 盘路径下。
此时我们就可以执行 debug 命令了。
这里需要注意一点,我在 Windows 10 系统下搭建 Debug 环境时,在挂载完成后输入 debug ,还是提示 Illegal command:debug ,此时你需要再下载一个 debug.exe ,贴心的我也把下载地址给你了。
下载地址:https://pan.baidu.com/s/177arSA34plWqV-iyffWpEw#list/path=%2F 密码:3akd
需要下载里面的 debug.exe,然后把它放在你挂载的路径下,这里我挂载的路径时 D 盘下的 debug 文件夹。
放置完成之后,再输入 debug 就可以了。
因为每次打开 Dosbox 都会执行上面这些命令,真的好烦,那怎么办呢?一个简单的办法是在 Dosbox 安装路径下找到
打开之后,在末尾键入
就 OK 了,下次直接打开 Dosbox ,会默认执行这三条命令,至此,就是我搭建 Dosbox 遇到的所有问题了。
Debug 实战
玩儿汇编得学会用 Debug ,Debug 是一种调试程序,通过 Debug 能让我们能够看到内存值,跟踪堆栈情况,看到寄存器所暂存的内容等,同时也能够更好地帮助我们理解汇编代码,所以学会 Debug ,非常重要,这是一种不可或缺的动手能力。
下面我们会用到几种 Debug 命令,这里先简单介绍下。
Debug 命令有很多,不过常用的一般就上面这几个。
好了,现在我们直接进入正题,开始在 Dosbox 上正式进行 Debug 操作,首先打开 Dosbox。
嗯。。。。。。这个界面我们打开很多次了。
那我写个命令呢?好吧,没演示过,下面就来了!
Debug -r
亲,用 Debug -r 就可以查看和修改 CPU 寄存器内容了呢。
查看寄存器内容。
这里需要注意一下 -r 大小写的问题,Debug -r 是查看寄存器内容。而 -R 则是无效指令。
上图列出来了很多寄存器,你可能觉得无从下手,不要乱,我们先从最基本的开始入手,也就是 CS 和 IP,CS(Code Segment)是代码段寄存器,一般也被称为段基址,可以认为是程序访问的入口,CPU 需要从 CS 中找到从哪个位置开始取指执行,但是我们还不知道要取哪一段,这时候 IP 的作用就体现出来了,IP(Instruction Pointer)就是指令指针寄存器,也叫做偏移地址,它会告诉我们从段基址开始,取哪一段的地址。
可以使用段基址:偏移地址来确定内存中的指定地址。
这里我们只是简单聊一下这两个寄存器的概念,要了解这两个寄存器的具体作用,可以看笔者的上一篇文章
使用 -r 也能够修改寄存器的内容,如下所示
-r 一般的格式是 -r 寄存器,然后系统会进行冒号提示,后面就是你要修改的内容。
Debug -d
使用 -d 指令可以查看内存中的内容。
输出的内存值默认是按照 CS:IP 的地址开始的,由于 CS 的值默认是 073F,而 IP 默认是 0100,所以 -d 的内存值是 073F:0100 。
-d 的格式很多,下面只介绍一下常用的几种格式。
形似 -d 1000:0 这种 -d 段基址 偏移地址的格式可以产生如下输出。
如上图所示,Debug 会列出指定内存单元中的的内容。上图中的每一个 00 都表示 8 位,如果是 4A,那么这八位展开来说就是 0010 1011 。每一行有 16 个 8 位,所以构成了 128 位内存地址。
为什么都是 00 呢,因为内存单元的值没有被改写,说白了就是这块内存区域没有存值,如何改写我们后面会说。
每一行的中间都有一个 -
,这个是为了便于我们阅读来设置的,- 号前后都有 8 个内存单元,这样便于查看。
右侧几个 ...... 表示每个内存单元可显示的 ASCII 码字符,因为内存没有值,所以也没有对应的 ASCII 码。我们可以数一下,每行有 16 个 . ,这表示每一个 00 都对应了一个 ASCII 码。
我们可以使用 -d 1000:9 这种 -d 段基址:起始偏移地址 格式来显示从 1000 的第几位开始。
Debug 从 1000:9 开始,一直到 1000:88,一共是 128 个字节,第一行中的 1000:0 ~ 1000:8 中的内容没有显示。
还可以使用 -d 1000:0 9 这种 -d 段基址:起始偏移地址 结尾偏移地址的格式来输出。
还可以是使用 -d 偏移地址来在不指定段基址的情况下,查看内存值。