实验一 查看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

的指向。

 

转载于:https://www.cnblogs.com/mr-gao1/p/9850934.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值