实验任务
(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.汇编语言的书写 还需要经常练,经常写错,多敲个回车......