实验五
(1) 将下面的程序编译、连接,用Debug加载、追踪,然后回答问题。
先利用r命令来查看各个寄存器的值,然后从cx中可知道程序的长度,用cx中的值减去20h(数据段和栈段已分配的空间)得到代码段的长度,用u命令精确反汇编,先执行到000D之前,看看ds是否已成功指向数据段,然后我们接着执行到程序返回前,即到001D之前,再查看一次数据段的内容。可以看到,数据段没有发生变化。
调试结果如下:
1.用d命令查看后发现data段中的数据不变。
2.CPU执行程序,程序返回前,cs=0772,ss=076F,ds=0760。
3.设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
(2) 将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
调试结果如下:
1.CPU执行程序,程序返回前,data段中的数据不变。
2.CPU执行程序,程序返回前,cs=0772,ss=0771,ds=0770。
3.设程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack的段地址为:X-1
4.如果段中数据占N个字节,该段实际占有的空间为[(N+15)/16].([x]是取整函数)
(3)1.CPU执行程序,程序返回前,data段的数据为23 01 56 04
2.CPU执行程序,程序返回前,cs=0770, ss=0774h,ds=0773
3.设程序加载后,code段地址为X, 则data段地址为X+3,stack段地址为X+4
(4)第一和第二个程序不能运行,因为把end start 改为end,程序就不会从start开始执行了,所以IP的初值为0,所以会从第一个段开始执行。
仅第三个仍然可以执行。
(5)编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中
调试结果如下:
(6)编写代码,用push指令将a段中的前8个字型数据,逆序存储到b段中
总结:我了解了将数据、代码、栈放入不同段的程序的编写和调试,并且理解了具有多个段的汇编源程序对应的目标程序执行时,内存分配方式。
字节型数据和字型数据:字节型数据只占一个字节;字型数据占连续两个字节,低字节在前,高字节在后。
从r命令中可看到cs,ds,ss之间的关系,也学习到了不同代码段放在不同段里的操作。