汇编实验五 编写、调试具有多个段的程序

南京信息工程大学实验报告

实验名称   实验 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

时间: 2024-10-12 13:10:05

汇编实验五 编写、调试具有多个段的程序的相关文章

实验5 编写调试有多个段的程序

实验1 assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2]

实验 5 编写、调试具有多个段的程序

实验结论 实验1 1.实验代码 assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2

实验五 编写、调试具有多个段的程序

四.实验结论 1 (1)cpu执行程序,程序返回前,data段中的数据为:23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09 如下图所示: (2)cpu执行程序,程序返回前,cs=076c,ss=076b,ds=076a 如下图所示 (3)设程序加载后,code段的段地址为x,则data段的段地址为x-2h,stack段的段地址为x-1h 因为data一共占16个字节,stack一共占16个字节. 2 (1)cpu执行程序,程序返回前,data段中的数

【实验五】编写、调试具有多个段的程序

四.实验结论 *任务(1)(2)(3)基本步骤相同,这里只列举出(1)的实验步骤 步骤一:把要使用的代码粘贴到masm文件夹中. 步骤二:编译.连接.用debug调试. 步骤三:用r命令查看哥寄存器的值. cs是code的段地址,ds是data的段地址,ss是stack的段地址.这是因为代码前面的声明:   assume cs:code, ds:data, ss:stack 步骤四:用u命令反汇编,注意反汇编是code段,所以u命令后接的应该是cs. 步骤五:用g命令执行,根据反汇编得到的代码,

实验五:编写、调试具有多个段的程序

实验任务一 将下面的程序编译.链接,用debug加载.跟踪,然后回答问题. 1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 4 data ends 5 6 stack segment 7 dw 0, 0, 0, 0, 0, 0, 0, 0 8 stack ends 9 10 code segment 11 start: mo

汇编实验五

一.实验目的 1. 理解和掌握将数据.代码.栈放入不同段的程序的编写和调试. 2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式. 二.实验准备 1. 结合第 6 章教材和课件,复习第 6 章内容. 2. 复习第 3 章「栈」的知识. 三.实验内容 教材 133 实验 5: (1) 将下面的程序编译.连接,用Debug加载.追踪,然后回答问题. assume cs:code, ds:data, ss:stackdata segment  dw 0123h, 0456h, 0789

汇编试验五:编写、调试具有多个段的程序

ds 数据段放入数据正确: 两次push 操作后,ss栈段正确: 由于pop 操作顺序,ds数据段并没有发生改变: Source Code: assume cs:code, ds:data, ss:stack data segment dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,

实验5 编写、调试具有多个段的程序

1.将下面的程序编译.连接.用Debug加载.跟踪,然后回答问题. assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data m

汇编语言实验五

实验任务一 1.利用debug加载.跟踪程序 (1)先利用r命令来查看各个寄存器的值 (2)从cx中可知道程序的长度,用cx中的值减去20h(数据段和栈段已分配的空间)得到代码段的长度,用u命令精确反汇编 (3)先执行到000D之前,看看ds是否已成功指向数据段 (4)从上图可以看到ds已指向数据段,然后我们接着执行到程序返回前,即到001D之前,再查看一次数据段的内容 (5)从上图可以看到,数据段没有发生变化 2.书上的问题解答: (1)程序返回前,data段中的数据为 23 01 56 04