游戏攻略网
当前位置: 首页 游戏攻略

debug汇编指令怎么用(手把手教你汇编)

时间:2023-06-03 作者: 小编 阅读量: 1 栏目名: 游戏攻略

使用Debug能让我们方便查看CPU各种寄存器的值、内存情况,方便我们调试指令、跟踪程序的运行过程。此时我们就可以执行debug命令了。放置完成之后,再输入debug就可以了。好了,现在我们直接进入正题,开始在Dosbox上正式进行Debug操作,首先打开Dosbox。Debug-d使用-d指令可以查看内存中的内容。如上图所示,Debug会列出指定内存单元中的的内容。上图中的每一个00都表示8位,如果是4A,那么这八位展开来说就是00101011。每一行有16个8位,所以构成了128位内存地址。

Hello大家好,我是程序员cxuan!这篇文章我们来进行实际操作一下Debug。

我们以后将会用到很多 debug 命令,这里我们先来熟悉一下它们。

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:///s/177arSA34plWqV-iyffWpEw#list/path=/ 密码: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 偏移地址来在不指定段基址的情况下,查看内存值。

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 命令显示我们写入的机器码。

可以看到 1000:0000 ~ 1000:0006 这个内存地址使我们写入的机器码,-u 这个命令就是将内存单元的内容翻译为汇编指令并显示。

-u 输出的结果分为三部分显示:

  • 最左侧是每一条机器指令的地址;
  • 中间是机器指令;
  • 最右侧是机器指令执行的汇编指令。

1000:0 处存放的是写入的机器码 B8 01 00 组成的机器指令,对应的汇编指令是 MOV AX,0001。

1000:0003 处存放的是写入的机器码 B9 02 00 组成的机器指令,对应的汇编指令是 MOV CX,0002。

1000:0006 处存放的是写入的机器码 C1 C8 所组成的机器指令,对应的汇编指令是 add ax,cx。

Debug -t

上面介绍的一系列指令包括我们上面提到的 Debug -e 机器码都是向内存中进行写入,那么如何执行这些指令呢?

我们可以使用 Debug -t 来执行写入的指令。使用 Debug -t 可以执行由 CS:IP 指向的指令。

既然是 -t 能够执行从 CS:IP 指向的命令,所以我们有必要将 CS:IP 指向 1000:0(因为我们前面将指令写在了 1000:0 处)。

首先我们需要执行 -r cs 1000 ,-r ip 0 把 CS:IP 赋值为 1000:0。

然后执行 -t 指令,下图是已经执行过的指令截图。

可以看到,执行完 -t 指令之后,MOV AX,0001 这条指令被执行,当前 AX 寄存器的内容变为了 0001,这条汇编指令的意思就是把 0001 移动到 AX 寄存器中。

继续执行 -t 之后,我们可以看到寄存器的变化。

Debug -a

毕竟机器指令不是那么好懂,写入很不方便,所以有没有办法能够支持我们直接写入汇编指令呢?还真有,Debug 提供了 -a 这种方式来实现汇编指令的写入。如下图所示

可以看到,我们使用了 -a 命令来对 1000:0 进行写入,分别输入 mov ax,1 mov bx,2 mov cx,3 add ax,bx add ax,cx add ax,ax 指令,然后按回车进行确定执行。

我们使用 -d 1000:0 f 可以看到从偏移地址 0 处开始的第 f 个内存指令(因为最大写入的地址只是 f)。

上图中的 1000:000F 为什么有值呢,因为我们上面已经执行过这个写入了。

另外,使用 -a 可以从一个预设的地址处开始输入指令。

总结

今天和大家聊了一下 Debug 的基本用法,主要包括

  • -r 查看、修改寄存器中的内容
  • -d 查看内存中的指令
  • -e 修改内存中的内容
  • -u 可以将内存中的内容解释为机器指令和对应的汇编指令
  • -t 执行 CS:IP 处的指令
  • -a 以汇编得形式向内存写入内容

汇编指令的选项有很多,上面介绍的这些属于经常用到的指令,这些指令要能够熟练使用。

,
    推荐阅读
  • 海燕你可长点心吧片段(海燕呢你可长点心吧)

    我感觉不好,后来跟他提出了分手,还没完全断,目前又纠结,自己年龄大了,不知道还能遇到比他更好的吗,不知道是我想得太多了吗,他是适合我的人吗?这是前提,这是基础。自己家条件不好,所以要找一个经济条件好点的媳妇减轻负担。那么另外一个问题就来了,为什么这么明显的套路,你却看不透,到最后做决定,也只有“感觉不好”。行动力的缺乏,是缺乏承担责任的意识造成的。人只有被拿走依靠后,才能调动出生命的全部潜能。

  • 公共服务事项身份证首次申领(省内居民申领临时身份证)

    公共服务事项身份证首次申领来源:台海网台海网5月31日讯据莆田网报道记者昨日从仙游县公安局获悉,5月30日起,该局推出省内临时居民身份证“立等可取”便民新举措,实现全县公安机关19个派出所全覆盖。因辖区派出所受理县外居民临时居民身份证需户籍地派出所审核审批,受理后,户籍民警积极与当事人户籍所在地县区公安机关经办人联系,即时审核签发。在全省各县区公安机关积极协作配合下,确保协作机制规范化、常态化、具体化。

  • 御赐小仵作小金鱼是亲生的吗(御赐小仵作小金鱼和小锦鲤)

    因为女主楚楚也说过,萧瑾瑜和哥哥虽然是双胞胎,但是从骨相来看,这两个人不像是亲兄弟。薛大人表面上一直在维护小金鱼,但是他自己身份却并不简单,他自称“本王”,但是目前电视剧中除了小金鱼自己是安郡王之外,只有一个昌王是公开的王爷身份。也就是说,薛大人很有可能就是改头换面的昌王。相信,以王爷的智商与情商,他应该会选择理性处理,最终与薛汝成恩断义绝。萧瑾瑜的猜测没有错,昌王确实是打算造反的。

  • 单反拍照安全快门(小白学摄影第二十二期)

    所谓“安全快门”的基本条件,第一点是在手持相机拍摄的情况下,不使用三脚架和其他帮助稳定的器材。除了全画幅以外,数码相机中还存在APS-C画幅的相机。与全画幅不同的是,我们在计算APS-C画幅相机的“安全快门”时,要进行一些简单的换算,也就是我们常说的把实际焦距换算成等效焦距。所以“安全快门”在现在来看,其实仍然具有参考价值。

  • 党组词(党组词介绍)

    以下内容大家不妨参考一二希望能帮到您!党,汉语一级字,读作党,为了政治目的结合起来的团体:党派。

  • 新时代的城市设计(建设城市的体验)

    巴黎空运东京空运伦敦空运当游戏进行到了各种货运任务开启之后,想必市长竞赛系统已经入了玩家的法眼,这个就是本作可以最大限度获取模拟币以及大量氪金绿钞的活动了。竞赛内容包含一系列的任务,在限定时间完成任务获取绿水晶点数。

  • 近代为什么不能进资本主义(为什么要书写资本主义史)

    主要研究和教学领域为劳工史、企业史、消费史和资本主义史。对我来说,相比那些人身攻击而言,更加值得关注的是,这简直就是一场关于资本主义的新颖讨论。按照这种观点,资本主义史只不过是自然法则的逻辑展现,就像苹果从树上落下一样。作为一种学术性实践,历史学就是用来解释事件实际上是如何发生的,以及随之产生的所有不符合规律的情况。随着美国从自大萧条以来最为严重的金融危机中复苏,人们不难理解这种突如其来的紧迫感。

  • 最终幻想15mod怎么用(最终幻想15绅士mod3DM)

    在上个月时候,《最终幻想15》上线了自己的MOD工具,于是有一大批好事的MOD制作者开始在创意工坊上线了自己制作的MOD。其中有意思的是有许多人恶搞了游戏中的4名男性。救生员格拉迪欧拉斯将在这个MOD里扮演一名救生员。格拉迪欧拉斯的体型看起来就是大哥哥类型,扮演一名救生员那也是情理之中了。值得一提的是,这个MOD当中还有雷霆和克劳德的人物MOD。巴哈姆特将自己化身成巴哈姆特,那一定看起来很酷炫。

  • win11隐藏文件在哪(Win11怎么查看隐藏文件和文件夹)

    一般来说系统会对比较重要的文件和文件夹添加隐藏属性,很多朋友可能找半天都找不到,那么怎么找出这些隐藏文件和文件夹呢,今天系统之家小编来教大家Win11显示隐藏文件的设置方法,操作步骤其实挺简单的,希望能够帮到大家。Win11怎么显示隐藏文件:1、打开win11的此电脑,从而打开文件资源管理器,或者鼠标右键开始菜单选择文件资源管理器打开。以上便是查看Win11隐藏文件的方法,操作步骤相比以前方便了许多,可以直接选显示隐藏的项目。

  • 大年初一晚上吃饺子的寓意(大年初一晚上吃饺子的寓意是什么)

    大年初一晚上吃饺子的寓意“饺子”又名“交子”或者“娇耳”,是新旧交替之意。饺子是北方人年夜饭桌上必不可少的。主要是在中国大部地区主要是北方,包饺子、吃饺子,已经成为大多数家庭欢度除夕的一个重要活动。过年,是中国人一年一度最隆重的节日。从腊月二十三,俗称“小年”的时候起,就进入了过年的倒计时,张彩灯、贴对联、打扫庭院,准备迎接远方的亲人,过个团圆年。