一.实验准备学习
1.为了便于验证明验结果,对「2. 实验任务」中的(1)作以下调整:spa
在使用 a 命令输入指令调试前,使用 e 命令将内存单元 0021:0 ~0021:7 连续 8 3d
个字节数据修改成 30H, 31H, 32H, 33H,34H,35H,36H,37H调试
2.修改完成后,用d命令进行查看是否完成了修改code
二.使用Debug,将书中的事例程序段写入内存,逐条执行,根据指令执行后的实际运行状况完成书中填空blog
1.用a命令将事例汇编指令写入内存(注:第 1 行的 mov ax, ffff → 改成 mov ax, 0021)内存
2.实验前根据理论知识进行书中内容填空io
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命令查看寄存器的初始值class
栈顶的初值为ss=073F,栈底的初值为sp=00FDbug
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 的用法,切实体会到「栈」内存空间的复杂性,不只要考虑到越界
,还发现了中断机制的存在,只是如今咱们还没法深刻了解中断机制,期待在后续课程的学习中可以
深刻研究其内在缘由。