实验1 用机器指令和汇编指令编程

实验1 用机器指令和汇编指令编程

1. 教材实验1结论

教材实验1中「2. 实验任务」(P45)

实验任务(1)

机器码数据较多,只用前4行实验即可。
用t命令和a命令两种方式,写入内存。用t命令单步调试。附上实验截图。
任务里说用t命令和a命令两种方式,写入内存,感觉有点奇怪,可能是打错了吧,所以先用了e命令写入了内存。
①e命令

先使用e指令写入4条机器码指令,其中地址随便弄的(1000:0),然后通过r命令查看了当前各个寄存器的值,此时AX、BX的值均为0,CS:IP指向为 073F:0100。为了使之前输入的指令能被当即执行,所以通过r修改了当前的CS:IP的指向。修改后,通过r命令查看了当前各个寄存器的值,此时CS:IP指向为 1000:0000,且CPU下一步要执行的指令变成了“MOV AX, 4E20”,也就是机器码“b8 20 4e”对应的汇编指令。

接着使用t命令完成单步调试。
②a命令
先退出 debug 环境后用 cls 命令清除屏幕上的内容,再重新进入debug环境中,首先用 a 命令输入汇编指令,和 e 命令中一样,地址依旧弄的(1000:0)。
(注意:数据后面不可写“H”,否则会报错。)
然后通过r命令查看了当前各个寄存器的值,此时CS:IP指向为 073F:0100。和使用e命令一样,将CS:IP地址更改为 1000:0000。

 接着使用t命令完成单步调试。

 实验任务(2)

附上a命令写入和t命令单步调试实验截图。对于单步调试较多的部分,只截调试开始,和调
试出正确结果的部分即可。
 先用 r 命令查看各寄存器的值,并将CS:IP地址更改为 2000:0000。

 然后用a命令写入指令,由于之前已经将当前CS:IP地址改为 2000:0000,所以 a 后面的地址可以省略。

 接着不断使用 t 命令进行单步执行。

 在执行过 8 次“ADD AX, AX”指令后可以求得 2 的 8 次方(即:0100),最后结果如下图所示

实验任务(3)

附上在debug里实验的截图,并且基于实验结果,作必要的文字说明。
 使用 d 命令查看从FFF00H~FFFFFH的内存单元中的内容,可以发现生产日期为1992年01月01日。

 接着使用 e 命令修改FFFF5开始的 8 个内存单元中的内容并再次使用 d 命令查看FFF00H~FFFFFH内存单元中的内容,发现生产日期并没有被改变,依旧是 01/01/92。

原因应该是日期信息位于内存ROM区,无法对其进行写入修改。

实验任务(4)

附上在debug里实验的截图,并且基于实验结果,作必要的文字说明
首先输入:-e  B810:0000    01 01 02 02 03 03 04 04,在屏幕右上角出现了四个不同的图案。

 接着修改前六个数据:-e  B810:0000    07 12 24 27 66 66 04 04 ,前面三个图案有变化,最后一个没有变化。

最后修改填写的地址:-e  1000:0000    01 01 02 02 03 03 04 04 ,屏幕上不再出现任何图案。

 

说明:在8086PC机的内存中,从A0000~BFFFF的内存单元是显存地址空间,所以向 B810:0000 开始的内存单元写数据就是向显存写数据,这些数据转换成ASCLL码后又会被显卡输出到显示器上,在屏幕对应位置显示相应的图案。

2. 教材实验2结论

此部分书写内容:

教材实验2中「2. 实验任务」(P74)实验任务(1)

① 截图记录:使用 e 命令修改 内存单元0022:0~0022:f 中的数据,及修改后查看是否正确写入的操作

② 截图记录:使用 a 命令输入的 p74 指令


③ 截图记录:每一行指令单步调试(如单步调试步骤多,可分屏截图,但不要有遗漏)

 

 

 

④ P74 中指令执行后各个寄存器填空结果,以在文档中手工标注或手机拍照截图方式复制在
文档中。 对于③单步调试的观察,与理论上分析的结果进行比较,检验是否一致。如不一
致,分析原因。
      mov ax,0022

           mov ds,ax

           mov ax,2200
      mov ss,ax
      mov sp,0100

         mov ax,[0]      ;ax=5150
          add ax,[2]      ;ax=A4A2
         mov bx,[4]      ;bx=5554
     add bx,[6]      ;bx=ACAA

           push ax         ;sp=00FE ;修改的内存单元的地址是0022:00FE 内容为A4A2
           push bx         ;sp=00FC ;修改的内存单元的地址是0022:00FC 内容为ACAA
           pop ax          ;sp=00FE ;ax=ACAA
           pop bx          ;sp=0100 ;bx=A4A2

           push [4]        ;sp=00FE ;修改的内存单元的地址是0022:00FE 内容为5554
           push [6]        ;sp=00FC ;修改的内存单元的地址是0022:00FC 内容为5756

经检验,理论分析与实验结果一致

实验任务(2)

① 截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,
及修改后查看的部分
 
② 单步调试每一行汇编指令的截图。每一条指令单步调试后,都使用 d 命令查看
2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元
值的变化,并思考原因。
以文字方式陈述:
① 前3行汇编指令的功能,特别是,mov sp, 10意味着什么?初始时栈顶和栈底分别是?
     第一行指令是将 2000H 存入 AX 寄存器中,第二行指令是将 AX 的值送给栈段寄存器 SS,前两行指令实现的功能就是将 SS 的值变成 2000,第三行指令的功能是将栈指针寄存器 SP 的值改成 0010。但是在截图中却并没有出现 MOV SP, 10 这条语句,通过阅读书上实验任务部分发现这是因为中断机制使得这条指令在执行完 MOV SS, AX 后自动被执行了。初始时栈顶是20010H,栈底是 20012H。
② 基于单步调试观察到的变化,给出你对此的思考及可能原因分析。

    1、从 MOV AX, 3123 这条指令开始 2000:0 ~ 2000:f 中的值就发生了变化,出现了不需要的数字。

    2、在栈顶所在位置的 SP-2 的内存单元中存放的始终是AX 中的值。

    3、虽然栈底的位置在 20012H,但是入栈时却是从 20015H 开始存数据的。 

 我觉得出现以上情况的原因可能是 因为 MOV SP, 10 这条由于中断机制被自动执行的指令。

 

posted @ 2020-10-13 09:08  Winnie77  阅读(154)  评论(3)    收藏  举报