实验一 查看CPU和内存,用机器指令和汇编指令编程
一.实验准备
前言:由于大家的电脑大多使用的是64位的操作系统,不能在系统自带的MS-DOS环境下编写汇编源程序,所以我们需要DOSBox这个软件,以便在64位环境下编写汇编源程序。
下载完成后进行挂载,进入挂载虚拟盘进入debug环境即可
二.使用debug将书中事例程序段写入内存,逐条执行,观察每条指令执行后CPU相关寄存器中内容的变化
(可用E命令和A命令以两种方式将指令写入内存)
1.使用e命令将指令机器码写入指定1000:0地址的内存
2.使用u命令进行反汇编查看是否与对应的汇编指令相符合
经过核对与相应的汇编指令符合
3.使用t命令单步执行
由于指令行数过多,这里只列出了部分代码截图。
经核对,其符合汇编指令的执行
第一步,将寄存器ax的值设为4e20h
第二步,将寄存器ax的值加上1416h变为6236h
第三步,将寄存器bx的值设为2000h
第四步,将寄存器ax的值与bx的值想加并赋给ax
......
步骤过多就不在此一一列举了,总之可以发现用e指令通过机器码修改内存的内容可以达到汇编指令的作用
4.使用a命令以汇编指令的形式在内存中写入机器指令
5.使用u反汇编指令检查汇编指令与机器码是否对应
可以发现将汇编指令反汇编后的机器码与之前所列机器码一致
6.使用t命令进行单步执行
通过汇编指令与单步执行的结果与机器码单步执行的结果一致
三.将下面三条指令写入从2000:0开始的内存单元中,使用下面三条指令计算2的8次方
1.代码分析
---恢复内容结束---
实验结论
一.实验准备
前言:由于大家的电脑大多使用的是64位的操作系统,不能在系统自带的MS-DOS环境下编写汇编源程序,所以我们需要DOSBox这个软件,以便在64位环境下编写汇编源程序。
下载完成后进行挂载,进入挂载虚拟盘进入debug环境即可
二.使用debug将书中事例程序段写入内存,逐条执行,观察每条指令执行后CPU相关寄存器中内容的变化
(可用E命令和A命令以两种方式将指令写入内存)
1.使用e命令将指令机器码写入指定1000:0地址的内存
2.使用u命令进行反汇编查看是否与对应的汇编指令相符合
经过核对与相应的汇编指令符合
3.使用t命令单步执行
由于指令行数过多,这里只列出了部分代码截图。
经核对,其符合汇编指令的执行
第一步,将寄存器ax的值设为4e20h
第二步,将寄存器ax的值加上1416h变为6236h
第三步,将寄存器bx的值设为2000h
第四步,将寄存器ax的值与bx的值想加并赋给ax
......
步骤过多就不在此一一列举了,总之可以发现用e指令通过机器码修改内存的内容可以达到汇编指令的作用
4.使用a命令以汇编指令的形式在内存中写入机器指令
5.使用u反汇编指令检查汇编指令与机器码是否对应
可以发现将汇编指令反汇编后的机器码与之前所列机器码一致
6.使用t命令进行单步执行
通过汇编指令与单步执行的结果与机器码单步执行的结果一致
三.将下面三条指令写入从2000:0开始的内存单元中,使用下面三条指令计算2的8次方
2000:0 mov ax,1
2000:3 add ax,ax
2000:5 jmp 2000:0003
1.代码分析
cs:ip初始指向2000:0
mov ax,1;将ax的值设为1
add ax,ax:可以看成将ax+ax的值再赋给ax
jmp 2000:0003;跳转到2000:3的位置,执行add ax,ax指令
这样就构成了一个循环,当ax=100h时即十进制的2的8次方
1 +1=2
2+2=4
4+4=8
8+8=10
10+10=20
20+20=40
40+40=80
80+80=100
(以上数字均为16进制)
100h=16的平方=2的八次方
执行8个循环后(8x3)所得值为100h(16的平方)即为2的八次方。
2.按要求输入指令并单步执行
通过代码实操演练发现与代码分析情况一致:
(1 +1=2
2+2=4
4+4=8
8+8=10
10+10=20
20+20=40
40+40=80
80+80=100
(以上数字均为16进制)
100h=16的平方=2的八次方
执行8个循环后(8x3)所得值为100h(16的平方)即为2的八次方。)
三.查看内存中的内容
PC机主板上的ROM中写有一个生厂日期,在内存FFF00H~FFFFFH的某几个单元中,请找出到这个生存日期并试图改变它
1.用d指令查看内存FFF00H~FFFFFH内容,FFF00H~FFFFFFH为物理地址,CS:IP=FFF0:0 FF
显示出的左边是每行的起始地址,中间是从指定地址开始的128个内存单元内容,用十六进制的格式输出,
右边是每个内存单元中的数据对应的可显示的ASCII码字符。
可以看到在右下角有从FFF0:00F5开始的8个内存单元显示为01/01/92,该值便是ROM的生厂日期
2.利用e指令修改从从FFF0:00F5开始的8个内存单元,并再用d指令查看修改后的值
在修改内存单元内容后发现日期并没有被修改,猜测可能与dosbox有关,我们查看的可能是虚拟机的日期,
需要换成XP系统进入debug中进行查看
四.向内存从B8100H开始的单元中填写数据,如:
e b810:0000 01 01 02 02 03 03 04 04
并改变其内容观察现象
1.向内存从B8100H开始的单元中填写数据
输入完成enter后发现屏幕右上角显示出这样的图案
2.修改内存单元中内容并观察变化
注:第一次我将所有内容都进行了修改,发现屏幕上并没有出现任何图案
修改最后一个内存单元的内容,出现这样的图案,与初始图案有所不同
修改最后两个内存单元的内容,出现这样的图案,与前面的图案均不同
修改最后三个内存单元内容,出现
修改最后四个内存单元内容,出现
通过修改发现,每次内存单元内容的改变都会影响到图案。
五.总结和体会
通过此次实验,我了解学习了Debug程序的主要用法,Debug是DOS,
Windows都提供的实模式(8086方式)程序的调试工具,使用它的各种指令
查看,改变,内存和寄存器中的内容。
深刻的体会到了用汇编指令代替机器码的便利性,编程语言是计算机发展的必经之路
当然,实验也反映了理论与实践之间的距离,经过已经了解了各种指令的用法。但在第一题中,
使用t指令进行单步执行时,寄存器内容并没有任何改变,原来是忘了t指令的用法,没有注意到CS:IP
的指向。