实验之前的一些总结:
- 命令r——查看,修改寄存器的内容
-r (查看所有寄存器的内容)
-r ax (查看或修改某一个寄存器的内容)
- 命令d——查看内存中的内容
-d (从当前的ds和ip所指向的地址开始,连续查看128个字节的内容)
-d 0:200 (从给定的地址开始连续查看128个字节的内容)
-d 0:200 204 (从给定地址到204为止连续查看内容)
-d 0:200 l5 (从给定地址连续查看5个字节的内容)
- 命令e——改写内存中的内容
-e 0:200 33 34 35 36 37 (从给定地址连续修改)
-e 0:200 <enter> (按空格则继续修改,按回车则停止)
- 命令a——向内存写入汇编指令
-a (默认从当前cs和ip开始写入)
-a 0:200 (指定地址写入指令)
- 命令g——一次性执行写入的汇编指令
-g 0107 (从当前cs和ip开始执行到某一地址为止一次性执行,不包括这一地址)
-g 0:200 0:208 (当用a指定地址写入指令时,g也要指定地址一次性执行,此时g从0:200到0:207执行)
- 命令t——一次执行一条汇编指令
-t (从当前cs和ip开始执行一条指令)
-t=0:200 (从指定地址开始执行一条指令)(注意等号)
- 命令u——将内存中的机器指令翻译成汇编指令
-u (从当前cs和ip连续反汇编32个字节)
-u 0:200 l5 (从指定地址开始连续反汇编5个字节)
-u 0:200 208 (与g指令类似,但写法不同)
实验开始:
-
程序段的输入和执行
(1)先用e命令将机器码写入内存:
再用u反汇编确认指令已写入内存中:
(2)用a命令将汇编指令写入内存:
再用e命令查看机器码,而确认指令已写入内存中:
(3)用t命令逐条执行指令:
小结:
当我们指定地址进行汇编指令的输入时,一定要注意使用带参数的t命令,或者将当前cs和ip的值改变为我们指定的地址,这样才能正确执行我们写入的指令。
-
将指令写入指定的内存单元,利用指令求2的8次方
(1)利用a命令写入指令:
(2)用t命令逐条执行(注意:保存在寄存器中的值为16进制,当ax的值为100时,即为十进制中的2的8次方,也就是256)
:
:
: (省略中间执行的过程)
小结:
注意我们用a命令将指令写入从2000:0开始的内存单元中,则在第一次使用t命令时要带参数,即从指定地址开始执行指令,或者改变当前cs和ip的值;记住寄存器中存的数据是十六进制的。
-
查看内存中的内容
(1)用d命令查看内存FFF00H~FFFFFH中的内容:
(2)我将试图用e命令修改上面显示的日期:01/01/92
(结果我失败了)
小结:
这段内存是属于ROM的,因为ROM是只读存储器,即只能读取,不能写入,所以我尝试向其写入数据的做法是无效的,也就是我改日期而失败的原因。
-
向内存B8100H开始的单元中填写数据
(1)在此地址上填写数据:
换一种方法填写:
(2)改变地址填写数据:
小结:
地址8000H~9FFFH的空间为显存地址空间,即我们向这些地址写入数据,则这些数据会被写入显存中,然后会被显卡输出到显示器上,则呈现了四个多彩的图案。
实验体会:
- 通过本次实验,我熟悉了debug命令的使用,可以向内存输入小程序而运行;
- 在第三个小实验中,一开始看到我的PC主板上的ROM的生产日期居然是92年1月1日,惊了一下,后来上网查了一下,发现很多人都跟我一样。其实我们下载的dosbox读取的是虚拟主板的信息,这里显示的日期并不是实际的生产日期(庆幸,我的电脑不是翻新机)。
- 我对第四个小实验很感兴趣,于是向这段地址,写入了其他的数据,于是有了这样的图案:
(下次想要在显示器上显示出男女的符号表示,就知道可以向显存地址空间写入0B 0B 0C 0C)