这次实验的主要内容是学习编写多个段的程序,了解源文件中段与段的组织关系带来的区别。
前三个实验都是阅读程序回答问题。在此,我直接给出结果。
第一个:
1、data 段数据不变。
2、cs=076C, ss=076B, ds=076A(每个人的答案略有不同,因电脑而异)。
3、若 cs=X, ss=X-1, ds=X-2。(准确地说和每个段给的具体内容占的字节数有关。这题给的两个段的字节数都是16个字节(1 H)。具体看第二个第4问的答案。)
第二个:
1、data 段数据不变。
2、cs=076C, ss=076B, ds=076A(每个人的答案略有不同,因电脑而异)。
3、若 cs=X, ss=X-1, ds=X-2。(准确地说和每个段给的具体内容占的字节数有关。这题给的两个段的字节数都是小于16个字节(1 H),但是也按16个字节(1 H)算。)
4、若某个段中的数据占 N个字节,程序加载后,该段实际占有的空间为 (N/16+1)Bytes。
第三个:
1、data 段数据不变。
2、cs=076A, ss=076E, ds=076D(每个人的答案略有不同,因电脑而异)。
3、若 cs=X, ss=X+4, ds=X+3。( 准确地说和每个段给的具体内容占的字节数有关。这题给的cs段的字节数为26个,那么程序加载后,cs 段拥有的空间就是:用段地址来说就是,X ~ ( X+(26/16+1)) ,计算一下,也就是 X ~ (X+2)。ss段则从 X+3开始,ds段的字节数为4个字节,拥有的空间:X ~ (X+1),那么段地址就到 X+3+1 结束, ss段则从 X+4开始,ss 段的字节数为4个,那么段地址就到 X +4 +(4/16+1)结束。)
实验四是问对于上面三个程序如果不指定程序入口,那个程序仍然可以正确执行?
答案显然是第三个。因为源文件按书写的顺序设置各个段。如果有 start ,那么在程序加载的时候,cs 的值会被修改为 start 标识的那个段地址;如果没有没有 start,那么 cs的值默认就是程序加载后开头的段地址。因为第三个程序的 code 段就在程序开头,所以,没有start 也可以正常执行。
实验五是填补给定的程序,调试、观察过程。程序实现的是把 a,b 段的数据依次相加,放入 c段。代码如下:
接下来,我们来运行一下看看答案对不对。
在最后能够看到,c 里的数据的确为 a 和 b 两的依次的和。
实验六也是补充一段程序,功能是将 a 段的前8个字节型数据逆序存放在b里。代码如下:
我们运行查看结果。
对比前后,结果是正确的。
总结与体会
通过这次实验,我明白了,要学会灵活地组织代码,灵活的使用栈,数据段等等东西。