汇编实验五

实验五

(1)书上填空如图所示:

(2)书上填空如图所示:

(3)&(4)书上填空如图所示:

注意十六进制末尾加h,没有h的是十进制

(5)汇编源程序代码如下:

用d命令查看逻辑段c8个字节:

(先找到c对应的ss段地址076c再往后找8个字节)

确实为空

执行完实现加的运算后查看c逻辑段

正确实现数据相加

(6)汇编源程序代码如下:

 

查看逻辑段b8个字单元:

 

该处逻辑段b不为0

这个和后面要学的中断机制有关。
参考在第3章实验2的实验任务(2)观察的内容和思考
这里只要观察(SP)=0010H,表明,初始栈顶没有变化,这仍然可看作空栈。因为,如果有数据入栈,栈顶指针SP的值会发生改变。
那为什么倒数几个字节不是初始的0,而是有所变化?这个和中断有关。如果仔细观察,倒数第3-6个字节值076d:000D刚好是前面单步调试中断处下一条将要执行的指令的地址。
所以,实际上,在debug中使用t单步调试的时候,隐含使用中断机制,中断,意味着程序要暂停正在执行的程序,转出处理单步中断要查看的内容,但是,中断后为了能够返回,所以,需要记录返回的地址,以及中断处理之前程序执行的上下文环境信息,这一部分是通过栈暂存的,就是我们所看到的后面变化的部分。具体地,由系统操作。至于系统操作的细节,就要看其背后具体的设计和实现机制了。
(chapter12学习了解中断更多相关的知识)

执行完push,查看逻辑段b内存单元:

实现了逆序存放

总结与体会:

1.栈段长度至少为16字节

2.(5)中也可以分段使用ds存放(其实是本题正解):

让逻辑段 a 作为数据段(和 ds 关联起来),c 作为附加段(和 es 关联起来);将逻辑段 a 的
数据→复制到逻辑段 c(可借助 mov 和 loop 实现)

让逻辑段 b 作为数据段(和 ds 关联起来),c 作为附加段(和 es 关联起来);将逻辑段 b 的
数据加到逻辑段 c(可借助 add 和 loop 实现)

此处我的做法误用栈,虽然能达到结果但是不符合汇编要求

同时注意,汇编运行是根据cs的段地址,不能将cs当做数据段段地址:严重错误

posted @ 2018-11-24 21:33  红袍小恶魔  阅读(228)  评论(3编辑  收藏  举报