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

本文详细解析了使用Debug工具执行8086汇编指令的过程,重点介绍了栈内存空间的特性及使用,包括mov、add、sub、push、pop等指令的运用,揭示了栈内存的复杂性及中断机制的影响。

一.实验准备

  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 的用法,切实体会到「栈」内存空间的复杂性,不仅要考虑到越界

,还发现了中断机制的存在,只是现在我们还无法深入了解中断机制,期待在后续课程的学习中能够

深入研究其内在原因。

转载于:https://www.cnblogs.com/mr-gao1/p/9854548.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值