汇编语⾔学习⼿把⼿的Debug教程
⽬录
Debug 是什么
Debug 实战
Debug -r
Debug -d
Debug -e
Debug -u
Debug -t
Debug -a
总结
关于汇编的第⼀篇⽂章:
Hello⼤家好,我是程序员cxuan!我们上篇⽂章了解了⼀下基本的寄存器,这篇⽂章我们来进⾏实际操作⼀下。
我们以后将会⽤到很多 Debug 命令,这⾥我们先来熟悉⼀下它们。
Debug 是什么
Debug 是 Windows / Dos 操作系统提供的⼀种功能。使⽤ Debug 能让我们⽅便查看 CPU 各种寄存器的值、内存情况,⽅便我们调试指令、跟踪程序的运⾏过程。
接下来我们会⽤到很多 debug 命令,但是使⽤这些命令的前提是,你需要在电脑上安装⼀下 debug,Windows/Mac 都可以安装,获取链接我已经给你出来了。阿,忘记说了,我们这⾥使⽤的是 Dos box来模拟汇编的操作环境。
下载完成后打开 DosBox ,打开之后是这样的。
此时我们输⼊ debug 命令应该提⽰的是
因为我们还没有进⾏连接和挂载,此时我们执⾏
mount c D:\debug
执⾏这条命令时,你需要现在 D 盘下创建⼀个 debug ⽂件夹,然后我们挂载到 debug 下⾯。
并且执⾏C:切换到 C 盘路径下。
此时我们就可以执⾏ debug 命令了。
这⾥需要注意⼀点,我在 Windows 10 系统下搭建 Debug 环境时,在挂载完成后输⼊ debug ,还是提⽰ Illegal command:debug ,此时你需要再下载⼀个 ,贴⼼的我也把下载地址给你了。
需要下载⾥⾯的 ,然后把它放在你挂载的路径下,这⾥我挂载的路径时 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 码。
ascii文件夹怎么创建我们可以使⽤ -d 1000:9 这种 -d 段基址:起始偏移地址格式来显⽰从 1000 的第⼏位开始。
Debug 从 1000:9 开始,⼀直到 1000:88,⼀共是 128 个字节,第⼀⾏中的 1000:0 ~ 1000:8 中的内容没有显⽰。
还可以使⽤ -d 1000:0 9 这种 -d 段基址:起始偏移地址结尾偏移地址的格式来输出。
还可以是使⽤ -d 偏移地址来在不指定段基址的情况下,查看内存值。
Debug -e
上⾯说的都是查看内存中指定位置或者区域的值,下⾯我们要来改写⼀下内存值。
使⽤-e可以改写内存值,⽐如我们想要改写 1000:0 ~ 1000:f 中的内容,可以使⽤ -e 1000:0 0 1 2 3 4 5 6 7 8 9 0 a b c d e f 这种⽅式,如下图所⽰。
这⾥需要注意下,在进⾏ -e 改写的时候,每个值中间都有⼀个空格,如果没有空格的话,会当做⼀个内存值来看待。
然后⽤ -d 1000:0 看到我们刚改写的内存值。
还可以使⽤提问的⽅式来逐个修改从某⼀地址开始的内存单元的内容。
还是⽤ 1000:100 来举例⼦,输出 -e 1000:100 后按下回车键。
如上图所⽰,可以看到我们先输⼊了⼀次 -e 1000:100 这个指令,然后按下了回车键。
注意,如果这⾥你按下了回车键,就相当于整个 -e 改写的过程已经完成。
如果你想要继续改写后⾯内存中的值,你需要按下空格键。
我们改写了 1000:100 之后的内存值,然后使⽤ -d 1000:100 查看我们改写的内容是否⽣效。
-e 命令还可以⽀持写⼊字符,⽐如我们可以向 1000:0 这个位置开始写⼊数值和字符,-e 1000:0 1 ‘a' 2 ‘b' e ‘c' 。
如上图所⽰,当我们向内存写⼊字符 ‘a' ‘b' ‘c' 的时候,会⾃动转换为 ASCII 码进⾏存储,在最右侧可以到刚刚写⼊的字符。Debug -u
如何向内存中写⼊⼀段机器码呢?⽐如我们想要在内存中写⼊⼀段机器码。
我们可以使⽤ -e 来进⾏写⼊,向内存中写⼊ b8 01 00 b9 02 00 01 c8 这个机器码,如下所⽰
我们使⽤ -e 写⼊之后,使⽤ -d 查看内存值,可以发现我们刚刚写⼊的值,但是却看不到机器码,所以机器码该如何看呢?
别急,还有个 -u 命令,这个就是看机器码的,如下图所⽰,我们使⽤ -u 命令显⽰我们写⼊的机器码。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论