首先开始今天的学习前,小伙伴们还是要检查下必要的汇编工具是否已经下载了。
这里推荐一个学习汇编必须的工具DOSBOX
链接:https://pan.baidu.com/s/1hQr9fYXffE6cVLwh26HFUA
提取码:xlzb
该系列博文是基于王爽老师著的汇编语言第三版,电子书获取地址如下:
链接:https://pan.baidu.com/s/1kB9-tRtywNWagf5av4N7zQ
提取码:xlzb
写今天这篇博客的目的就是让大家在学了一些理论概念后,先通过DOSBOX输入Debug来了解一些简单指令的运行现象以方便后续的理论知识学习。
建议参考以下视频一步一步下载安装,这里就不再赘述了。
DOSBOX的下载安装与使用
Debug的命令大概有20多个,这里我整理了6个在第一阶段学习会使用到的功能:
我们来简单的演示下这六个功能:
我们打开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键。
如果我们想要查看此时此刻内存中的内容,D命令就派上用场了,由于D命令的格式众多,这里就只简单介绍本次实验能够用得上的格式。
如果我们想要知道指定物理地址的内存信息,可以通过d 段地址信息:偏移地址的方式来查看,比如:
使用这种格式查看,Debug将会列出从指定内存单元开始的128个内存单元的内容,使用D指令后,Debug会输出三部分内容:
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命令查看修改效果,发现已经修改成功。
我们需要先用E命令修改一下内存中的数据,然后通过D命令查看下效果:
当然我们也可以将一些有含义的机器码输入到内存中,这里我简单的提供一些有含义的机器码及其对应的汇编指令。
百度百科:
机器码一般指机器指令码。 计算机直接使用的程序语言,其语句就是机器指令码,机器指令码是用于指挥计算机应做的操作和操作数地址的一组二进制数。
我的理解:
其实所谓的机器码在我看来就是CPU对应的本能,某些机器码再CPU出厂的时候就被写入到ROM中,当CPU遇到这些机器码就可以进行对应的业务操作。
接下来我们用e命令将机器码写入内存:
那么我们如何知道这些机器码对应的汇编指令呢?此时就可以通过U命令来完成。接下来我们输入U命令:
我们可以观察到U命令的展示页面分为三部分:
在我们完成指令的写入后,如何执行这些指令呢?T指令就派上了用场,我们可以使用T命令来执行CS:IP指向的指令内容,先简单的举个例子:
第一步我们使用E指令为连续的八个内存单元写入机器码。
第二步我们使用R指令修改寄存器保存的地址信息。
第三步我们使用t指令执行寄存器指向的指令信息。
前面我们使用E命令写入机器指令这样很不方便,因为数字明显不符合我们日常的语言习惯。这个时候A命令就派上了用场,A命令允许我们直接以会变得形式写入指令,比如:
如图我们使用A指令为指定的内存区域写入汇编指令后,使用U命令查看,这个时候已经写入成功了,简单总结A指令就是从一个预设的地址开始输入指令。
在我们明白Debug中六个基础命令的作用后就可以开始今天的第一堂汇编实验课了,今天的课题内容很简单,就是输入几组简单的汇编指令,然后通过观察内存的变化感受汇编指令的作用。
注:表中汇编指令有的结尾部分为H,其代表的是该数据为16进制,输入DoxBox时请忽略不用输入!否则会报错!
我们先输入A+回车,然后依次输入指令,最后通过D命令观察内存现象:
我们再通过R命令查看下现在的指令指向:
接下来输入T命令执行汇编指令,观察现象:
这里我们运行了三条指令,第一条MOV AX,4E20 运行后我们可以观察到图中标记的第一个AX寄存器的值变为了4E20,接下来的MOV AX,1416 同样的将AX寄存器的值更改为了1416,最后的MOV BX,2000 则是将BX寄存器的值变更为了2000。剩下的指令读者老爷们可以依次通过T命令执行后并观察现象,这里博主就不再赘述了。
这里就不给各位看官老爷们自由发挥的机会了哈,各位小可爱按照我的指令依次敲入Debug即可:
第一步: 输入基础指令:
这里我们翻译下我们输入的指令:
接下来我们只需要输入T指令观察AX寄存器的变化即可:
这里我们发现每次指令为ADD AX,AX的时候,AX寄存器中的值就会完成AX × 2的操作,重复八次就可以求得2的八次幂的结果。
书中的实验任务其实还有两个,试验任务三查看ROM中P地址FFF00 - FFFFF中存储的PC机生产日期由于我们使用的时DosBox的虚拟软件,并不能支持显示ROM中存储的PC机的生产日期。试验任务四从内存B8100开始修改数据是个简单的通过E命令 修改内容,这个就留给小伙伴们自己独立完成了。
好了,今天的内容就到此结束了,有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。
码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~
博主在这里祝大家可以在新的一年升职加薪,走上人生巅峰!