汇编实验五
实验五
(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当做数据段段地址:严重错误