南京信息工程大学实验报告
实验名称 实验 5 编写、调试具有多个段的程序
实验日期 12.2
得分
学院 计软院
专业 计科
年级 2017级
班次 6班
姓名 江轲禹
学号 20171308227
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试 2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第6章教材和课件,复习第6章内容 2. 复习第3章「栈」的知识
三、实验内容
教材133实验 5 ps: 1. 实验5相关提示见本文档最后一部分「附:实验5提示&说明」 2. 为提高实验效率,我已将实验 5 的程序框架准备好,可以从课程公邮→文件中心→ 实验文件夹,下载实验5程序框架。
四、实验结论
实验任务(1)~(4),直接在教材上填写实验后通过运行、调试观察到的结果,以及由此得 到的结论,以拍照或直接在博客中录入方式,给出填写的结论。对结论得出的过程及调试过 程的检查,采用随机抽点现场操作演示并回答的方式检查。
实验任务(1)
代码如下:
在程序编译、连接完成之后,依次使用R命令,U命令,G命令,D命令进行调试
①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987
②CPU执行程序,程序返回前,cs= 076C,ss= 076B,ds= 076A
③设程序加载后,code段的段地址为:X ,则data段的段地址为:X-2,stack段的段地址为:X-1
实验任务(2)
代码如下:
在程序编译、连接完成之后,依次使用R命令,U命令,G命令,D命令进行调试,
①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h
②CPU执行程序,程序返回前,cs= 076C,ss= 076B,ds= 076A
③设程序加载后,code段的段地址为:X ,则data段的段地址为:X-2,stack段的段地址为:X-1
④程序加载后,该段实际占有的空间为:((N+15)/16)*16
对于第四小问,程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。以上两种情况总结成一个通用的公式:((N+15)/16)*16
实验任务(3)
代码如下:
在程序编译、连接完成之后,依次使用R命令,U命令,G命令,D命令进行调试
①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h
②CPU执行程序,程序返回前,cs= 076A,ss= 076E,ds= 076D
③程序加载后,code段的段地址为:X,则data段的段地址为:X+3 ,stack段的段地址为:X+4
实验任务(4)
如果将最后一条伪指令“end start”改为“end”,相当于没有指明程序入口,此时程序就会从加载进内存的第一个单元起开始执行。程序(1)(2)都是数据先加载进内存,CPU会误把数据也当成指令执行,因而不能被正确执行;而程序(3),则是代码段先被加载进内存,不存在把数据误当成指令,因而可以被正确执行。
实验任务(5),要求在博客中给出如下内容:
(1) 汇编程序源代码
(2) 在debug中调试程序截图,截图中包括如下信息:
① 在实现数据相加前,逻辑段c的8个字节
② 执行完实现加运算的代码后,逻辑段c的8个字节
(3) 根据①和②的调试,验证是否正确的实现数据相加。
代码如下:
依次使用g命令,d命令,在执行后查看a、b、c段中的存储数据
查看c段中最终存储的数据
此程序的功能是实现数据的相加,查看c段的最终数据,验证结果。
实验任务(6), 要求在博客中给出如下内容:
(1) 汇编程序源代码
(2) 在debug中调试程序截图,截图中包括如下信息:
① 在push操作执行前,查看逻辑段b的8个字单元信息截图
② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图
(3) 根据①和②的调试,验证是否正确的实现数据相加。
代码如下:
在程序编译、连接完成之后,依次使用R命令,U命令,G命令,D命令进行调试
使用G命令,D命令,执行并查看a段,b段中存储的数据,以及b中最终存储的数据
由上图可知,前8个字型数据已经逆序存储到b中
五、总结与体会
1.一个段的大小是16个字节,因此程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。
2.在不指明数据的入口的情况下,若程序是先进行数据加载的,将不能被正确执行;若先进行段的加载,则不受影响。
原文地址:https://www.cnblogs.com/jiangkeyu/p/10055330.html