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

实验任务

(1)使用debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。

a.使用 e 命令修改 0021:0~0021:f 数据为30H,31H,32H,33H,34H,35H,36H,37H,并查看。

截图

b.将下面的程序段写入内存

mov ax,0021

mov ds,ax

mov ax,2200

mov ss,ax

mov sp,0100

mov ax,【0】;                                             ax=3130H;

add  ax,【2】;                                             ax=6462H;

mov bx,【4】;                                             bx=3534H;

add  bx,【6】;                                             bx=6C6AH;

push ax;                                                            sp=00FEH;           修改的内存单元的地址为2200:00FEH,内容为6462H;

push bx;                                                         sp=00FCH;           修改的内存单元的地址为2200:00FCH,内容为6C6AH;

pop ax;                                                           sp=00FEH;        ax=6C6AH;

pop bx;                                                           sp=0100H;         bx=6462H;

push 【4】                                                        sp=00FEH;        修改的内存单元的地址为2200:00FEH,内容为3534H;

push 【6】                                                        sp=00FCH;        修改的内存单元的地址为2200:00FCH,内容为3736H;

以上是我对这段代码的理论分析结果,接下来我们具体操作看看。

 输入期间发生了点小差错,不过没关系,继续补上(不知道对内存空间有没有影响)

 

ax,bx的值都符合理论上的值。第一个SP也符合。

 

 

查看内存单元,符合预期值。

(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

输入7行指令,又打错了,汇编代码还需要多打打,用e命令对2000:0之后的16个内存单元值进行修改,

然后通过d命令对内存单元进行查看,修改成功。

2000:0开始的值未发生变化

 

这一步2000:0 f 的值开始发生变化,缺少了mov ss,10的操作,ss段寄存器的值变为2000,数据段的地址发生了变化,

进栈,操作

3366H进栈,

第一行代码的功能为将ax的值赋为2000,把ss段寄存器的赋为2000,此时的栈顶2000:0010,mov sp,10,的意思经过查阅资料发现是留10个内存空间给接下来的寄存器比如cs等等。

至于书上写的中断机制,即debug每用t执行命令,会停止继续执行,显示当前每个存储器的状态和下步操作,而上面mov ss,10肯定执行了,但是下一步栈不能完全还原上一步中个存储器的状态,所以导致2000:0之后的f'个内存单元的数值发生了变化。

总结与反思

1.还需要注意push是sp-2,pop是sp+2,空栈的栈顶为0010H。

2.对于-d命令可以时刻观察某一或某段内存单元的内容,有助于进行实验。

3.通过查阅资料可以初步了解中断机制的过程,这是在以后的汇编编程中要注意的。

4.汇编语言的书写 还需要经常练,经常写错,多敲个回车......

原文地址:https://www.cnblogs.com/-Cold/p/9862586.html