[从零学习汇编语言] - Debug指令与入门

前言

首先开始今天的学习前,小伙伴们还是要检查下必要的汇编工具是否已经下载了。

这里推荐一个学习汇编必须的工具DOSBOX
链接:https://pan.baidu.com/s/1hQr9fYXffE6cVLwh26HFUA
提取码:xlzb

该系列博文是基于王爽老师著的汇编语言第三版,电子书获取地址如下:

链接:https://pan.baidu.com/s/1kB9-tRtywNWagf5av4N7zQ
提取码:xlzb

写今天这篇博客的目的就是让大家在学了一些理论概念后,先通过DOSBOX输入Debug来了解一些简单指令的运行现象以方便后续的理论知识学习。

一、Debug与常用功能

1. DOSBOX的安装

建议参考以下视频一步一步下载安装,这里就不再赘述了。

DOSBOX的下载安装与使用

2. 常用的DEBUG命令

Debug的命令大概有20多个,这里我整理了6个在第一阶段学习会使用到的功能:
在这里插入图片描述
我们来简单的演示下这六个功能:

1.1 用R命令查看、改变CPU寄存器的内容

我们打开DOXBOX,输入R
在这里插入图片描述
在我们之前的学习中我们已经学习过了AX,BX,CX,DX,CS,IP这六个寄存器,这里如果还不清楚的小伙伴可以参考下面的这篇文章:

[汇编语言] - 常见寄存器详解

这里我们需要注意CS和IP寄存器的值,在上一篇我曾讲过CS和IP这两个寄存器主要是负责存储将要执行的指令信息,此时CS = 073F ,IP = 0100 ,这代表着内存073F:0100处的数据就是CPU当前需要读取,执行的指令。我们还可以在输出页面的最下方看到这一行信息:
在这里插入图片描述
这里就是展示了CS:IP此时所指向的内存单元的机器码为 0000,对应的汇编指令就是 ADD [BX+SI],AL (这里我们暂时还不了解指令含义,无需深究)。当然我们还可以用R指令来改变寄存器的内容,我们需要输入R指令加寄存器名来进行指定寄存器的操作,然后再输入想要的数据即可,这里需要注意的是每次指令输入后记得按一下Enter键。
在这里插入图片描述

1.2 用D命令查看内存中的内容

如果我们想要查看此时此刻内存中的内容,D命令就派上用场了,由于D命令的格式众多,这里就只简单介绍本次实验能够用得上的格式。
在这里插入图片描述
如果我们想要知道指定物理地址的内存信息,可以通过d 段地址信息:偏移地址的方式来查看,比如:
在这里插入图片描述
使用这种格式查看,Debug将会列出从指定内存单元开始的128个内存单元的内容,使用D指令后,Debug会输出三部分内容:

  1. 最左边是每行的起始地址
  2. 中间是从指定地址开始的128个内存单元的内容,用16进制的方式输出。
  3. 右边是每个内存单元中的数据对应的可现实的ASCII码,如果没有的话就用.代替

1.3 用E指令修改内存中的内容

E指令常被我们用来修改内存中的内容,比如我们可以将内存1000:0 到1000:9 单元中的内容分别写成0,1,2,3,4,5,6,7,8,9 我们可以采用 e 起始地址 数据 … 的格式来进行修改,比如:

在这里插入图片描述
图中我们用D命令查看了1000:0 到1000:f单元的内容,再用E命令修改了从1000:0 开始的10个单元的地址,最后再用D命令查看修改效果,发现已经修改成功。

1.4 用U命令查看内存中机器码的含义

我们需要先用E命令修改一下内存中的数据,然后通过D命令查看下效果:
在这里插入图片描述
当然我们也可以将一些有含义的机器码输入到内存中,这里我简单的提供一些有含义的机器码及其对应的汇编指令。

百度百科:
机器码一般指机器指令码。 计算机直接使用的程序语言,其语句就是机器指令码,机器指令码是用于指挥计算机应做的操作和操作数地址的一组二进制数。
我的理解:
其实所谓的机器码在我看来就是CPU对应的本能,某些机器码再CPU出厂的时候就被写入到ROM中,当CPU遇到这些机器码就可以进行对应的业务操作。

在这里插入图片描述
接下来我们用e命令将机器码写入内存:
在这里插入图片描述
那么我们如何知道这些机器码对应的汇编指令呢?此时就可以通过U命令来完成。接下来我们输入U命令:
在这里插入图片描述
我们可以观察到U命令的展示页面分为三部分:

  1. 最左侧是内存地址
  2. 紧跟其后的是内存中数据内容
  3. 最后的是数据内容对应的机器指令

1.5 用T命令执行指令

在我们完成指令的写入后,如何执行这些指令呢?T指令就派上了用场,我们可以使用T命令来执行CS:IP指向的指令内容,先简单的举个例子:
在这里插入图片描述
第一步我们使用E指令为连续的八个内存单元写入机器码。
第二步我们使用R指令修改寄存器保存的地址信息。
第三步我们使用t指令执行寄存器指向的指令信息。

1.6 用A命令以汇编指令的形式再内存写入机器命令

前面我们使用E命令写入机器指令这样很不方便,因为数字明显不符合我们日常的语言习惯。这个时候A命令就派上了用场,A命令允许我们直接以会变得形式写入指令,比如:
在这里插入图片描述
如图我们使用A指令为指定的内存区域写入汇编指令后,使用U命令查看,这个时候已经写入成功了,简单总结A指令就是从一个预设的地址开始输入指令。

二、实验

1. 通过输入汇编指令观察内存变化

在我们明白Debug中六个基础命令的作用后就可以开始今天的第一堂汇编实验课了,今天的课题内容很简单,就是输入几组简单的汇编指令,然后通过观察内存的变化感受汇编指令的作用。
注:表中汇编指令有的结尾部分为H,其代表的是该数据为16进制,输入DoxBox时请忽略不用输入!否则会报错!
在这里插入图片描述
我们先输入A+回车,然后依次输入指令,最后通过D命令观察内存现象:
在这里插入图片描述
我们再通过R命令查看下现在的指令指向:
在这里插入图片描述
接下来输入T命令执行汇编指令,观察现象:
在这里插入图片描述

这里我们运行了三条指令,第一条MOV AX,4E20 运行后我们可以观察到图中标记的第一个AX寄存器的值变为了4E20,接下来的MOV AX,1416 同样的将AX寄存器的值更改为了1416,最后的MOV BX,2000 则是将BX寄存器的值变更为了2000。剩下的指令读者老爷们可以依次通过T命令执行后并观察现象,这里博主就不再赘述了。

2. 通过指令求2的八次方

这里就不给各位看官老爷们自由发挥的机会了哈,各位小可爱按照我的指令依次敲入Debug即可:
第一步: 输入基础指令:
在这里插入图片描述
这里我们翻译下我们输入的指令:

  1. DEBUG启动程序
  2. A 2000:0 从物理地址为2000:0的存储单元开始修改数据内容
  3. mov ax,1 将AX寄存器的值修改为1
  4. add ax,ax 等同于ax+ax(ax × 2)
  5. jmp 2000:3 将CS:IP的值修改回2000:3
  6. **RCS ** 修改CS寄存器的值为2000
  7. RIP 修改ip寄存器的值为3
  8. R 查看当前寄存器和指令状态

接下来我们只需要输入T指令观察AX寄存器的变化即可:
在这里插入图片描述
这里我们发现每次指令为ADD AX,AX的时候,AX寄存器中的值就会完成AX × 2的操作,重复八次就可以求得2的八次幂的结果。

结语

书中的实验任务其实还有两个,试验任务三查看ROM中P地址FFF00 - FFFFF中存储的PC机生产日期由于我们使用的时DosBox的虚拟软件,并不能支持显示ROM中存储的PC机的生产日期。试验任务四从内存B8100开始修改数据是个简单的通过E命令 修改内容,这个就留给小伙伴们自己独立完成了。
好了,今天的内容就到此结束了,有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。
码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~
博主在这里祝大家可以在新的一年升职加薪,走上人生巅峰!

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
1. 基础概念 汇编语言是一种低级语言,它是计算机硬件指令的助记符。汇编语言直接反映了计算机的硬件结构,可以直接操作计算机的硬件资源。 汇编语言的基本单位是汇编指令,它由操作码和操作数两部分组成。操作码表示要执行的操作,操作数表示操作的对象或数据。 汇编语言的程序由若干条汇编指令组成,程序的执行顺序由程序中的指令顺序决定。 2. 寄存器 寄存器计算机中用来暂时存储数据的高速存储器件,是汇编语言中最常用的数据存储方式。 常用的寄存器有通用寄存器、段寄存器、指针寄存器、标志寄存器等。 通用寄存器包括AX、BX、CX、DX等,可以用来存储数据、地址、偏移量等。 段寄存器包括CS、DS、SS、ES等,用来存储段地址。 指针寄存器包括SP、BP、SI、DI等,用来存储栈指针、基址指针、源地址指针、目的地址指针等。 标志寄存器包括CF、PF、AF、ZF、SF、OF等,用来存储运算结果的状态信息。 3. 指令汇编语言指令集包括数据传送指令、算术指令、逻辑指令、比较指令、跳转指令、循环指令等。 数据传送指令用来把数据从一个地方传送到另一个地方,包括MOV、XCHG、LEA等。 算术指令用来进行加、减、乘、除等运算,包括ADD、SUB、MUL、DIV等。 逻辑指令用来进行位运算,包括AND、OR、NOT、XOR等。 比较指令用来比较两个数据的大小关系,包括CMP、TEST等。 跳转指令用来改变程序的执行顺序,包括JMP、JZ、JNZ、JE、JNE等。 循环指令用来重复执行一段程序,包括LOOP、LOOPE、LOOPZ、LOOPNE、LOOPNZ等。 4. 程序设计 汇编语言的程序设计需要掌握一定的技巧和方法,包括程序的结构、数据的处理、流程控制等。 程序的结构包括程序的头部、数据段、代码段、堆栈段等。 数据的处理包括数据类型、数据的存储和读取、数据的转换等。 流程控制包括条件判断、循环控制、函数调用等。 5. 汇编器和调试器 汇编器是将汇编语言程序翻译成机器语言程序的工具,可以将汇编语言程序转换成目标代码或可执行文件。 调试器是用来调试程序的工具,可以帮助程序员查找程序中的错误、调试程序的执行流程等。 6. 总结 学习汇编语言需要掌握基本概念、寄存器指令集、程序设计、汇编器和调试器等知识,需要进行大量的实践和练习,才能掌握汇编语言的编程技巧和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓龙oba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值