从0开始进入汇编的世界之每天理解一篇汇编帖-第四节(实验)

urfyyyy   ·   发表于 2020-06-18 23:44:28   ·   技术文章

前言

我们几乎已经补充了有关CPU工作原理的基础知识。这次我们一起来做几个小实验,通过动手来亲眼看到CPU的工作过程,用以加深印象

上一节链接
从0开始进入汇编的世界之每天理解一篇汇编帖-第三节


环境配置

开始实验之前,我们需要先配置一下环境,win10以下的哥哥,可以使用cmd,输入debug之后回车,即可打开调试环境。因win10已经移除了debug这个工具,所以win10用户需要手动安装

0x00 下载

首先我们需要下载DOSBox,然后继续下载MASM(无法科学上网的小哥哥们可以直接下载帖子下的附件)

0x01 安装

下载后,先安装DOSBox,随意选择一个安装目录即可

接下来将MASM解压到任意一个目录(目录层级越少越好,因为待会我们需要配置,目录少..打的字就少..)

0x02 配置

打开DOSBox.exe,并输入”mount c d:\MASM” (将masm挂在到dosbox的c盘符下)

0x04 进入debug

在这个界面下输入”debug”即可进入调试环境。

0x05 介绍debug

debug是DOS,windows都提供的程序调试工具。使用它,可以查看CPU各种寄存器中的内容,内存的情况,以及在机器码级跟踪程序的执行

debug的功能:

  1. debug "r"命令查看、改变CPU寄存器的内容;
  2. debug "d"命令查看内存中的内容;
  3. debug "e"命令改写内存中的内容;(用机器码改写)
  4. debug "u"将内存中的机器指令翻译成汇编指令;
  5. debug "t"命令执行一条机器指令;
  6. debug "a"命令以汇编指令的格式在内存中写入一条机器指令;

实验1

查看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地址中的内容


实验2

“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

  1. 将下面3条指令写入从 2000:0 开始的内存单元中,利用这3条指令计算28次方。
  2. mov ax,1
  3. add ax,ax
  4. 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改变,指令执行后,会改变相应的结果。


实验4

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(可读存储器)是改不了的……


实验5

向内存从B8100开始的单元填写数据,如:

  1. e B810:0000 01 01 02 02 03 03 04 04

请先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。

可以明显的看出,在屏幕上出现了几个小色块,一个蓝色的笑脸,跟着一个绿色的笑脸,然后一个蓝色的爱心,和一个红色的菱形。
为什么会出现这些东西呢,因为这个B8100是我们显存的一个地址,往这里写入数据就会在屏幕上显示出来,比如我改成其他的。

注:debug为调试工具,不是用来写汇编代码的!!!!

用户名金币积分时间理由
Yaoヽ药药 8.88 0 2021-03-14 20:08:08 一个受益终生的帖子~~

打赏我,让我更有动力~

附件列表

MASM-master.zip   文件大小:0.587M (下载次数:5)

DOSBox0.74-3-win32-installer.zip   文件大小:1.411M (下载次数:4)

3 条回复   |  直到 2021-3-27 | 938 次浏览

heqirong
发表于 2021-3-19

16位汇编已经过时了,可以从x86汇编开始学,进阶后再学x64汇编。

评论列表

  • 加载数据中...

编写评论内容

heqirong
发表于 2021-3-19

王爽的这本书16位,目前是搞单片机的,参加大学比赛,内存有限的情况下使用的比较多

评论列表

  • 加载数据中...

编写评论内容

罗轶凡
发表于 2021-3-27

期待更新ing。。。

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.