返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >汇编语言学习手把手的Debug教程
  • 793
分享到

汇编语言学习手把手的Debug教程

2024-04-02 19:04:59 793人浏览 独家记忆
摘要

目录Debug 是什么Debug 实战Debug -rDebug -dDebug -eDebug -uDebug -tDebug -a总结关于汇编的第一篇文章: 爱了爱了,这篇寄存

关于汇编的第一篇文章:
爱了爱了,这篇寄存器讲的有点意思

Hello大家好,我是程序员cxuan!我们上篇文章了解了一下基本的寄存器,这篇文章我们来进行实际操作一下。

原文链接:https://mp.weixin.qq.com/s/PQzuKtSiHwZleTosvop68A

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

Debug 是什么

Debug 是 windows / Dos 操作系统提供的一种功能。使用 Debug 能让我们方便查看 CPU 各种寄存器的值、内存情况,方便我们调试指令、跟踪程序的运行过程。

接下来我们会用到很多 debug 命令,但是使用这些命令的前提是,你需要在电脑上安装一下 debug,Windows/Mac 都可以安装,获取链接我已经给你找出来了。阿,忘记说了,我们这里使用的是 Dos box来模拟汇编的操作环境。

传送门(Mac 和 Windows 都是):Https://www.dosbox.com/download.PHP?main=1

image-20211017223618159

下载完成后打开 DosBox ,打开之后是这样的。

image-20211017223818599

此时我们输入 debug 命令应该提示的是

image-20211017223853097

因为我们还没有进行连接和挂载,此时我们执行


mount c D:\debug

执行这条命令时,你需要现在 D 盘下创建一个 debug 文件夹,然后我们挂载到 debug 下面。

并且执行 C: 切换到 C 盘路径下。

image-20211017224242053

此时我们就可以执行 debug 命令了。

image-20211017224458748

这里需要注意一点,我在 Windows 10 系统下搭建 Debug 环境时,在挂载完成后输入 debug ,还是提示 Illegal command:debug ,此时你需要再下载一个 debug.exe ,贴心的我也把下载地址给你了。

下载地址:https://www.jb51.net/softs/467705.html 

需要下载里面的 debug.exe,然后把它放在你挂载的路径下,这里我挂载的路径时 D 盘下的 debug 文件夹。

放置完成之后,再输入 debug 就可以了。

因为每次打开 Dosbox 都会执行上面这些命令,真的好烦,那怎么办呢?一个简单的办法是在 Dosbox 安装路径下找到

image-20211017225250971

打开之后,在末尾键入

image-20211017225326436

就 OK 了,下次直接打开 Dosbox ,会默认执行这三条命令,至此,就是我搭建 Dosbox 遇到的所有问题了。

Debug 实战

玩儿汇编得学会用 Debug ,Debug 是一种调试程序,通过 Debug 能让我们能够看到内存值,跟踪堆栈情况,看到寄存器所暂存的内容等,同时也能够更好地帮助我们理解汇编代码,所以学会 Debug ,非常重要,这是一种不可或缺的动手能力。

下面我们会用到几种 Debug 命令,这里先简单介绍下。

image-20211117222634775

Debug 命令有很多,不过常用的一般就上面这几个。

好了,现在我们直接进入正题,开始在 Dosbox 上正式进行 Debug 操作,首先打开 Dosbox。

嗯。。。。。。这个界面我们打开很多次了。

那我写个命令呢? 好吧,没演示过,下面就来了!

Debug -r

亲,用 Debug -r 就可以查看和修改 CPU 寄存器内容了呢。

查看寄存器内容。

image-20211117225112134

这里需要注意一下 -r 大小写的问题,Debug -r 是查看寄存器内容。而 -R 则是无效指令。

上图列出来了很多寄存器,你可能觉得无从下手,不要乱,我们先从最基本的开始入手,也就是 CS 和 IP,CS(Code Segment)是代码段寄存器,一般也被称为段基址,可以认为是程序访问的入口,CPU 需要从 CS 中找到从哪个位置开始取指执行,但是我们还不知道要取哪一段,这时候 IP 的作用就体现出来了,IP(Instruction Pointer)就是指令指针寄存器,也叫做偏移地址,它会告诉我们从段基址开始,取哪一段的地址。

可以使用段基址:偏移地址来确定内存中的指定地址。

这里我们只是简单聊一下这两个寄存器的概念,要了解这两个寄存器的具体作用,可以看笔者之前的文章

传送门:汇编语言入门汇编指令及寄存器详解教程

使用 -r 也能够修改寄存器的内容,如下所示

image-20211119182455417

-r 一般的格式是 -r 寄存器,然后系统会进行冒号提示,后面就是你要修改的内容。

Debug -d

使用 -d 指令可以查看内存中的内容。

image-20211119183448427

输出的内存值默认是按照 CS:IP 的地址开始的,由于 CS 的值默认是 073F,而 IP 默认是 0100,所以 -d 的内存值是 073F:0100 。

-d 的格式很多,下面只介绍一下常用的几种格式。

形似 -d 1000:0 这种 -d 段基址 偏移地址的格式可以产生如下输出。

image-20211119184935344

如上图所示,Debug 会列出指定内存单元中的的内容。上图中的每一个 00 都表示 8 位,如果是 4A,那么这八位展开来说就是 0010 1011 。每一行有 16 个 8 位,所以构成了 128 位内存地址。

为什么都是 00 呢,因为内存单元的值没有被改写,说白了就是这块内存区域没有存值,如何改写我们后面回收。

每一行的中间都有一个 -,这个是为了便于我们阅读来设置的,- 号前后都有 8 个内存单元,这样便于查看。

右侧几个 … 表示每个内存单元可显示的 ASCII 码字符,因为内存没有值,所以也没有对应的 ASCII 码。我们可以数一下,每行有 16 个 . ,这表示每一个 00 都对应了一个 ASCII 码。

我们可以使用 -d 1000:9 这种 -d 段基址:起始偏移地址 格式来显示从 1000 的第几位开始。

image-20211119194232683

Debug 从 1000:9 开始,一直到 1000:88,一共是 128 个字节,第一行中的 1000:0 ~ 1000:8 中的内容没有显示。

还可以使用 -d 1000:0 9 这种 -d 段基址:起始偏移地址 结尾偏移地址的格式来输出。

image-20211119194856418

还可以是使用 -d 偏移地址来在不指定段基址的情况下,查看内存值。

image-20211119201832383

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 这种方式,如下图所示。

image-20211119201236510

这里需要注意下,在进行 -e 改写的时候,每个值中间都有一个空格,如果没有空格的话,会当做一个内存值来看待。

然后用 -d 1000:0 看到我们刚改写的内存值。

还可以使用提问的方式来逐个修改从某一地址开始的内存单元的内容。

还是用 1000:100 来举例子,输出 -e 1000:100 后按下回车键。

image-20211119205201568

如上图所示,可以看到我们先输入了一次 -e 1000:100 这个指令,然后按下了回车键。

注意,如果这里你按下了回车键,就相当于整个 -e 改写的过程已经完成。

如果你想要继续改写后面内存中的值,你需要按下空格键。

我们改写了 1000:100 之后的内存值,然后使用 -d 1000:100 查看我们改写的内容是否生效。

-e 命令还可以支持写入字符,比如我们可以向 1000:0 这个位置开始写入数值和字符,-e 1000:0 1 ‘a' 2 ‘b' e ‘c' 。

image-20211119210708341

如上图所示,当我们向内存写入字符 ‘a' ‘b' ‘c' 的时候,会自动转换为 ASCII 码进行存储,在最右侧可以找到刚刚写入的字符。

Debug -u

如何向内存中写入一段机器码呢?比如我们想要在内存中写入一段机器码。

image-20211119220152007

我们可以使用 -e 来进行写入,向内存中写入 b8 01 00 b9 02 00 01 c8 这个机器码,如下所示

image-20211119224014093

我们使用 -e 写入之后,使用 -d 查看内存值,可以发现我们刚刚写入的值,但是却看不到机器码,所以机器码该如何看呢?

别急,还有个 -u 命令,这个就是看机器码的,如下图所示,我们使用 -u 命令显示我们写入的机器码。

image-20211119224851565

可以看到 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 指令,下图是已经执行过的指令截图。

image-20211120060826534

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

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

image-20211120061105506

Debug -a

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

image-20211120230320647

可以看到,我们使用了 -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)。

image-20211120231016386

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

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

总结

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

-r 查看、修改寄存器中的内容

-d 查看内存中的指令

-e 修改内存中的内容

-u 可以将内存中的内容解释为机器指令和对应的汇编指令

-t 执行 CS:IP 处的指令

-a 以汇编得形式向内存写入内容

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

以上就是汇编语言学习手把手的Debug教程的详细内容,更多关于汇编语言Debug教程的资料请关注编程网其它相关文章!

--结束END--

本文标题: 汇编语言学习手把手的Debug教程

本文链接: https://lsjlt.com/news/158127.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 汇编语言学习手把手的Debug教程
    目录Debug 是什么Debug 实战Debug -rDebug -dDebug -eDebug -uDebug -tDebug -a总结关于汇编的第一篇文章: 爱了爱了,这篇寄存...
    99+
    2024-04-02
  • 汇编语言Debug命令详解教程
    目录1. Debug-R命令2. Debug-D命令 3. Debug-E命令 4. Debug-U命令 5. Debug-T命令6. Debug-A命令参考书籍《汇编语言》——王爽...
    99+
    2024-04-02
  • Python学习教程:0基础学Python?手把手教你从变量和赋值语句学
    这篇Python学习教程将手把手教你入门学Python,从变量和赋值语句学起,前面也有专门给大家出过相关的详细教程,有需要的伙伴,可以找一下前面的教程!导读:在本文中,你会学到如何处理数字、定义与使用变量和常量,以及编写使用这些数据类型执行...
    99+
    2023-06-02
  • Python学习教程:手把手教你Sublime Text编辑器配置Python解释器
    前天有个伙伴问我一个关于Sublime text配置Python解释器的问题,也可能是初学者,对这方面还不是很懂,想使用快捷键但是徒劳一场,因为缺少Python解释器,直接按下快捷键Ctrl+B是不会得到想要的结果的。鉴于此,如果有小伙伴想...
    99+
    2023-06-02
  • Python学习教程:手把手教你使用Flask搭建ES搜索引擎
    Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库Apache Lucene™ 基础之上。那么如何实现 Elasticsearch和 Python 的对接成为我们所关心的问题了 (怎么什么都要和 Python 关联啊...
    99+
    2023-06-01
  • 手把手教你在Win7上安装Go语言
    《手把手教你在Win7上安装Go语言,需要具体代码示例》 在当今信息化的时代,计算机编程已经成为一项越来越重要的技能。而在众多的编程语言中,Go语言因其简洁、高效和并发性能优秀而受到广...
    99+
    2024-04-02
  • 汇编语言学习assume的作用详解
    assume 的作用是关联段名与段寄存器。 如果你在数据段中定义了变量名,比如: x db 0 而你在代码中,需要直接使用这个变量名,比如: mov al, ...
    99+
    2024-04-02
  • Python的下载安装(手把手教学)
    程序员养成日记第一天:从自主下载安装软件开始~~~ 目录 windows版本 MacOS版本  windows版本 进入Python官网    https://www.python.org/downloads/ 点击Downloads中...
    99+
    2023-10-02
    python 开发语言
  • 手把手带你学习C++的运算符
    目录运算符01 算术运算符02 赋值运算符03 比较运算符04 逻辑运算符总结运算符 作用:用于执行代码的运算 运算符类型 ...
    99+
    2024-04-02
  • 想成为编程高手?学习GO语言和Bash编程算法吧!
    作为一名程序员,不断学习新技能是非常重要的。GO语言和Bash编程算法是两种非常实用的编程技能,学习它们可以让你成为一名编程高手。本文将介绍GO语言和Bash编程算法的优点以及如何学习它们。 一、GO语言的优点 GO语言是一种静态类型、编...
    99+
    2023-08-25
    windows bash 编程算法
  • 手把手教你导入Go语言第三方库
    目录环境环境变量实践导包最好的学习方式就是实践。 我们通过导入gin包来深入学习。 环境 go 1.13.5 goland 2019.3.1 manjaro...
    99+
    2024-04-02
  • 手把手教你用C语言实现三子棋
    目录1.设计简单菜单2.创建棋盘3.下棋过程的实现 3.1玩家下棋 3.2电脑下棋3.3判断输赢4.游戏源码总结1.设计简单菜单 相信大家在玩游戏时会发现,进入游...
    99+
    2024-04-02
  • 手把手带你学习C++的数据类型
    目录数据类型01 整型:02 sizeof关键字03 实型(浮点型)04 字符型05 转义字符06 字符串型07 布尔型08 数据的输入总结 数据类型 C++规定在创建一个变量或者常...
    99+
    2024-04-02
  • 编程新手如何选择:先学习C语言还是C++?
    编程新手如何选择:先学习C语言还是C++? 在学习编程的旅程中,对于刚入门的新手来说,选择学习哪个编程语言往往是一个重要的问题。C语言和C++是两种非常经典的编程语言,它们有着各自的特...
    99+
    2024-04-02
  • 手把手教学,Python 游戏编程之实现飞机大战(含源代码)
    文章目录 一、游戏设定 1、游戏界面展示和设定 二、实现过程 1.我方飞机 2、敌方飞机 3、定义武器 4、武器补充库 5、主模块 总结: 前言 我想大家都是有玩过类似飞机大战的射击类游戏,也享受目...
    99+
    2023-09-12
    python 游戏 开发语言
  • 快速上手学习Go语言的技巧
    学习Go语言的快速入门技巧 Go语言是一种由Google开发的开源编程语言,它的设计目标是使得代码简洁、高效、易于阅读和维护。自从Go语言发布以来,它在云计算、网络编程、分布式系统等领域逐渐流行起来。如果你有...
    99+
    2024-01-30
    学习 Go语言 入门 网络编程 标准库
  • go语言适不适合新手学习
    这期内容当中小编将会给大家带来有关go语言适不适合新手学习,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。操作环境:windows10系统、GO 1.11.2、thinkpad t480电脑。Go(又称 G...
    99+
    2023-06-14
  • 手把手教会你使用redux的入门教程
    目录Redux详解Redux介绍Redux有什么作用如何在React中使用Redux如何使用React-reduxRedux详解 Redux介绍 Redux 是 JavaScript...
    99+
    2024-04-02
  • 新手学习Java语言的要点有哪些
    这篇文章主要讲解了“新手学习Java语言的要点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“新手学习Java语言的要点有哪些”吧!一、掌握静态方法和属性 静态方法和属性用于描述某一类对...
    99+
    2023-06-17
  • 想学习Go语言编程?这些教程值得一试!
    Go语言是一种开源的编程语言,由Google公司开发。它具有高效、简洁、安全等特点,适用于网络编程、云计算、分布式系统等场景。如果你想学习Go语言编程,以下这些教程值得一试。 1.《Go语言编程》 这是一本由许式伟所著的Go语言入门教程,适...
    99+
    2023-06-17
    教程 编程算法 numy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作