实验二 用机器指令和汇编指令编程
一.实验准备
1.为了便于验证实验结果,对「2. 实验任务」中的(1)做如下调整:
在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8
个字节数据修改为 30H, 31H, 32H, 33H,34H,35H,36H,37H

2.修改完成后,用d命令进行查看是否完成了修改

二.使用Debug,将书中的事例程序段写入内存,逐条执行,根据指令执行后的实际运行情况完成书中填空
1.用a命令将事例汇编指令写入内存(注:第 1 行的 mov ax, ffff → 改为 mov ax, 0021)

2.实验前根据理论知识进行书中内容填空
mov ax,0021 mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;ax = 3130 add ax,[2] ;ax = 6462 mov bx,[4] ;bx = 3534 add bx,[6] ;bx = 6C6A push ax ;sp = 00FE;修改的内存单元的地址是220FE内容为6462 push bx ;sp = 00FC;修改的内存单元的地址是220FC内容为6C6A pop ax ;sp = 00FE;ax = 6C6A pop bx ;sp = 0100;bx = 6462 push [4] ;sp = 00FE;修改的内存单元地址是220FE内容为3534 push[6] ;sp = 00FC;修改的内存单元地址是220FC内容为3736
3.在单步执行汇编指令前,先使用r命令查看寄存器的初始值

栈顶的初值为ss=073F,栈底的初值为sp=00FD
4.使用t命令进行单步逐条执行

这里面的代码中,在执行mov ss,ax后,应该待执行指令是mov sp,0100,但似乎跳过了这一句,而去待执行
下一句mov ax,[0].但对比观察后发现虽然mov sp,0100并没有显示待执行,实际上还是产生了执行了的效果,
sp的值被设为0100。可以看成mov ss,ax与mov sp,0100同时执行了


上面的执行语句中,出现了很多pop,push出栈,入栈语句,在入栈时sp = sp-2.在出栈时sp=sp+2

5.比对实验结果与理论填空
可以发现事先的填空内容与实验结果是一致的
三.仔细观察书中事例图的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变
1.按图中代码敲入

并用e命令修改2000:0~2000:f(第一条指令将ax的值设为2000H)内存单元的内容,用d指令查看是否修改成功
2.用r指令查看各寄存器初值

初始栈顶SS为073F,初始栈底SP是00FD,待执行语句为mov ax,2000
3.用t指令逐条执行

执行了mov ax,2000汇编指令,将ax寄存器的值设为2000,待执行指令 mov ss,ax

栈顶地址寄存器SS的值按指令设为了2000,在这里出现了上一个实验一样的情况,
在这里我们进行详细分析按逐条执行的顺序来说,下一条待执行指令应该是mov sp,10.
但这里似乎跳过了这条指令,待执行指令为mov ax,3123,经仔细比对寄存器内容
单步执行mov ss,ax前,ax = 2000;ss=073f;sp=00fd
单步执行mov ss,ax后,ax = 2000;ss=2000;sp=0010
发现SP的值被设为了10,也就是说mov ss,ax和mov sp,10同时执行了
一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器
的状态和下一步要执行的指令,但T命令执行mov ss,ax指令时却是同下一条指令一同执行
了,根据上一个实验和这个实验猜测在修改栈段寄存器SS指令时会出现这种情况
经了解这种现象是由于中断机制造成的,Debug的T命令在执行修改寄存器SS的指令时,下一
条指令也紧接着被执行了。

执行了mov ax,3123将ax的值设为3123,待执行push ax

执行了push ax语句,将ax寄存器内容入栈,栈底寄存器sp相应的发生变化,待执行mov ax,3366


后面均按照逐步执行的顺序进行执行了
四.总结
通过此次实验理解并掌握了「栈」内存空间的特性和使用理解并掌握 8086 汇编指令
mov, add, sub, push, pop 的用法,切实体会到「栈」内存空间的复杂性,不仅要考虑到越界
,还发现了中断机制的存在,只是现在我们还无法深入了解中断机制,期待在后续课程的学习中能够
深入研究其内在原因。

浙公网安备 33010602011771号