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

1. 教材实验 2P71

(1)练习「1.预备知识:Debug 的使用」

(2)在练习基础上,完成「2. 实验任务」补充:

为了便于验证实验结果,对「2. 实验任务」中的(1)做如下两点调整: 

①在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H 

②将 P74 实验任务(1)中第 1 行的 mov ax, ffff → 改为 mov ax, 0021  实验前,请理论上分析指令执行后各个填空处的值,并记录下来。

实验时,通过在 debug 中调试,观察实验结果与理论分析是否一致,如不一致,尝试。

发现问题所在,并分析原因。

p71练习实验截图如下:

练习实验分析:mov sp,10被执行了吗?

在程序执行前,ax=0000,ss=0b39,sp=ffee
在用T命令单步执行mov ax,2000后,ax=2000; ss=0b39;
sp=ffee

在用T命令单步执行mov ss,ax后,ax=2000;ss=2000;sp=0010

注意,在用T命令单步执行mov ss,ax 前,ss=0b39,sp=ffee,而执行后ss=2000,sp=0010。ss变为2000是正常的,这正是mov ss,ax的执行结果。sp变为0010是在mov ss,ax之后,因为它就是mov ss,ax的下一条指令。显然,在用T命令执行mov ss,ax的时候,它的下一条指令 mov sp,10也紧接着执行了。

实验任务(1):

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

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

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

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

实验二是在机房做的,当时没有查看修改后地址。在自己电脑重新修改截图如下:

前半部分输入a命令实验截图如下:

t命令单步执行截图如下:

第一部分得出结论:

ax=3130

ax=6462

bx=3534

bx=6C6A

后两部分结果如下:

sp=00FE;修改的内存单元的地址是 2200:FE到FF 内容为62   64 

ax入栈 sp=sp-2=0100H-2  =00FEH

sp=00FC;修改的内存单元的地址是 2200:FC到FD 内容为6A    6C     

bx入栈  sp=sp-2=00FEH-2=00FCH           

sp=00FE;ax=6C6A

sp=0100;bx=6462

push [4]                          sp=00FE;修改的内存单元的地址是  2200:FE到FF    内容为   34      35                

push [6]                          sp=00FC;修改的内存单元的地址是  2200:FC到FD   内容为    36      37  

由于疏忽,手写时错误的将得出结论的步骤弄错了一步,导致结果出现了上下相错的偏差,应注意。

实验任务(2): 

①  截图记录图 3.19 中使用 a命令输入的 7 行指令,使用 e 命令修改 2000:0~2000:f 的值,及修改后查看的部分 

②  单步调试每一行汇编指令的截图。且每一条指令单步调试后,都使用 d 命令查看

2000:0~2000:f 的值。观察每一条指令执行后相关寄存器值的变化,及 2000:0~2000:f 单元值的变化,并思考原因。 

用自己电脑做分步步骤如下:

分析结论:

初始的栈顶和栈底分别是2000:0010和2000:0010。

如练习实验(3)一样,执行中断例程时,CPU会将一些中断例程使用的的寄存器变量自动压栈到栈中,包括了上述的寄存器变量的值,命令紧接着执行。

 

posted @ 2018-10-27 22:44  星空下的杰恋  阅读(358)  评论(2编辑  收藏  举报