实验五

(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之间的关系,也学习到了不同代码段放在不同段里的操作。

 

posted on 2018-11-23 15:23  邱奕  阅读(175)  评论(0编辑  收藏  举报

导航