我们几乎已经补充了有关CPU工作原理的基础知识。这次我们一起来做几个小实验,通过动手来亲眼看到CPU的工作过程,用以加深印象
上一节链接
从0开始进入汇编的世界之每天理解一篇汇编帖-第三节
开始实验之前,我们需要先配置一下环境,win10以下的哥哥,可以使用cmd,输入debug之后回车,即可打开调试环境。因win10已经移除了debug这个工具,所以win10用户需要手动安装
首先我们需要下载DOSBox,然后继续下载MASM(无法科学上网的小哥哥们可以直接下载帖子下的附件)
下载后,先安装DOSBox,随意选择一个安装目录即可
接下来将MASM解压到任意一个目录(目录层级越少越好,因为待会我们需要配置,目录少..打的字就少..)
打开DOSBox.exe,并输入”mount c d:\MASM” (将masm挂在到dosbox的c盘符下)
在这个界面下输入”debug”即可进入调试环境。
debug是DOS,windows都提供的程序调试工具。使用它,可以查看CPU各种寄存器中的内容,内存的情况,以及在机器码级跟踪程序的执行
debug的功能:
用debug 的"r"命令查看、改变CPU寄存器的内容;
用debug 的"d"命令查看内存中的内容;
用debug 的"e"命令改写内存中的内容;(用机器码改写)
用debug 的"u"将内存中的机器指令翻译成汇编指令;
用debug 的"t"命令执行一条机器指令;
用debug 的"a"命令以汇编指令的格式在内存中写入一条机器指令;
查看CPU和内存,用机器指令和汇编指令简单编程
我们上面已经介绍了debug的一些用法。
我们使用”r”命令先查看一下CPU中各寄存器当前的内容
可以通过上图看到各类寄存器,此时ax、bx、cx、dx的值都为0,CS为073F,IP为0100,也就是说,内存073F:0100处的指令为CPU当前要读取、执行的指令,在所有寄存器的最下方,debug还列出了CS:IP所指向的内存单元处所存放的机器码,图中为”0000”,对应汇编指令为 add [BX+SI],AL
我们继续通过”r”命令来改变寄存器中的内容。若想修改某一寄存器,可以使用r 某一寄存器名
的形式来进行修改,如我们想修改ax中的值
可以看到我们将ax的值修改为了1111。
同时我们还可以用”r”命令修改cs和ip的值
可以看到此时cs的值被改成了1400,ip的值被改成了1111。现在CS:IP指向的地址为15111。其对应的机器码和汇编指令分别为”0000”和 “add [BX+SI],AL”
我们用”d”命令来查看内存中的内容。
如果我们想查看指定内存地址处的内容,如查看10000内存地址处的内容,可以使用d 段地址:偏移地址
的形式来完成
使用”d 段地址:偏移地”的格式,debug将列出从指定内存单元开始的128个内存单元中的内容,如上图就是列出了1000:0 - 1000:7F中的内容(也就是物理地址10000-1007F)
对上图做详细解释:
中间部分是从指定地址开始的128个内存单元中的内容,以16进制的形式输出,每行最多输出16个单元的内容。从图中我们可以知道,内存1000:0 - 1000:F的内容都在第一行,1000:10 - 1000:1F的内容都在第二行,以此类推。注意每行中间有一个”-“符号,用来将每行的输出分为2部分,”8个单元-8个单元”,这样便于查看。如果我们想查找1000:6B单元中的内容,则我们可以先找到1000:60这一行,”-“左边是1000:60 - 1000:67的8个单元,”-“右边是1000:68 - 1000:6F的8个单元,这样我们就可以从1000:68往后数3个单元,就能找到1000:6B。
当然,也可以直接使用d 1000:6B
来查看
这样debug就从1000:6B开始显示,一直显示到1000:EA处,一共也是128个字节,第一行中的1000:60 - 1000:68单元中的内容不显示,同样的,最下面一行1000:EB - 1000:EF中的内容也不显示。
最左边的是每行的起始位置
最右边的是每个内存单元中的数据对应的可显示的ASCII码字符,没有可显示的ASCII码字符时,debug就会用”.”来代替。(我们可以通过后面的 实验来验证看具体效果)
我们还可以使用”d”命令来查看一个指定的地址范围,此时采用d 段地址:偏移地址起始位置 偏移地址结尾位置
的形式来查看,如我们想查看1000:0 - 1000:9中的内容,可以使用d 1000:0 9
来实现
因为”段地址 x 16 + 偏移地址 = 物理地址”,所以我们得到一个物理地址有很多种方式,举2个例子,查看FFFF0地址中的内容
“e”命令改写内存中的内容;(用机器码改写)
“a”命令以汇编指令的格式在内存中写入一条机器指令
我们先用a命令来进行改写…………..
我们再用e命令来进行改写,命令格式e 起始位置 数据 数据 数据 ······
由于刚才用a命令我们是从073F:0100开始写的,所以这次换一个地方写
可以看到,虽然两次写入的位置不一样,但两次写入的结果是相同的。
接下来我们来执行一下这些指令,仔细观察指令执行的结果,以及每个寄存器的值,重点关注指令中操作的寄存器和IP寄存器。
我们要执行首先需要让CS:IP指向第一条指令的首地址
更改CS:IP后,可以看到第一条指令为mov ax,4E20
我们用”t”命令来执行指令。
mov ax,4E20
执行后,IP的值自动加3(指令为3个字节),ax的值被指令执行后改为4e20。
再次执行
add ax,1416
执行后,IP值自动加3(指令为3个字节),ax=ax+1416(4e20+1416=6236)
······以此类推……
将下面3条指令写入从 2000:0 开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
分析一下,我们需要使用到哪些命令,首先用”a”或者”e”命令写入内存,接着用”r”命令修改CS和IP的值使其指向第一条指令的首地址,然后用”t”命令执行
第一次执行,指令为mov ax,1
,则ax=1
第二次执行,指令为add ax,ax
,则ax=2
第三次执行,指令为jmp 2000:3
,则ax=2
第四次执行,指令为add ax,ax
,则ax=4
第五次执行,指令为jmp 2000:3
,则ax=4
第六次执行,指令为add ax,ax
,则ax=8
······
总共要执行16次,可以得到ax的值为100(16进制 100 就是10进制的 256,为2的8次方)
可以看到每次执行,IP的值都会自动改变或者被jmp改变,指令执行后,会改变相应的结果。
PC机主板上的ROM中写有一个生产日期,在内存FFF00 - FFFFF 的某几个单元中,请找到这个日期并试图改变它(ROM怎么改 T.T)
分析需要使用哪些命令,使用”d”命令查看内存单元,使用”e”命令写入内存。(机器码形式写入) ——FFF00 ~ FFFFF 有256个单元。
可以看到,d FFF0:0
列出了128个内存单元的内容,也就是FFF00 - FFF7F,在这个区间内,并没有生产如期,我们从继续从FFF80开始查看:d FFF0:80
我们可以看到,在FFFF0 - FFFFF的单元中,出现了生产日期,我们上面已经讲过,最右边的是每个内存单元中的数据对应的可显示的ASCII码字符,没有可显示的ASCII码字符时,debug就会用”.”来代替。
数一下日期从哪个单元开始出现(从0开始数,0,1,2,3,4,5),FFFF5这个单元内出现了30(16进制,对应的10进制数为48),30对应的ASCII码为0(因为10进制数48的ASCII码为0),FFFF6这个单元内出现了31(16进制,对应的10进制数为49)31对应的ASCII码为1,FFFF7这个单元内出现了2F(16进制,对应的10进制数为47),也就是说,2F对应的ASCII码为符号”/“。
我们已经成功找到了日期和日期对应的内存单元地址。
下图为ASCII码表的一部分
或者我们可以使用”d”命令的另一种方式更简单的查看,即用”d”命令来查看范围,d 段地址:偏移地址起始位置 偏移地址结尾位置
接着我们用”e”命令来改变日期的值
然后再来查看一下
可以看到,30还是30,并没有改成48,31也还是31,也没有改为23,没有什么改变,ROM(可读存储器)是改不了的……
向内存从B8100开始的单元填写数据,如:
e B810:0000 01 01 02 02 03 03 04 04
请先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。
可以明显的看出,在屏幕上出现了几个小色块,一个蓝色的笑脸,跟着一个绿色的笑脸,然后一个蓝色的爱心,和一个红色的菱形。
为什么会出现这些东西呢,因为这个B8100是我们显存的一个地址,往这里写入数据就会在屏幕上显示出来,比如我改成其他的。
注:debug为调试工具,不是用来写汇编代码的!!!!
用户名 | 金币 | 积分 | 时间 | 理由 |
---|---|---|---|---|
Yaoヽ药药 | 8.88 | 0 | 2021-03-14 20:08:08 | 一个受益终生的帖子~~ |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.
heqirong
发表于 2021-3-19
16位汇编已经过时了,可以从x86汇编开始学,进阶后再学x64汇编。
评论列表
加载数据中...
heqirong
发表于 2021-3-19
王爽的这本书16位,目前是搞单片机的,参加大学比赛,内存有限的情况下使用的比较多
评论列表
加载数据中...
罗轶凡
发表于 2021-3-27
期待更新ing。。。
评论列表
加载数据中...