南京信息工程大学实验报告
实验名称 实验 5 编写、调试具有多个段的程序 实验日期 11.26 得分
学院 计软院
专业 计算机科学与技术
年级 2017级
班次 5班
姓名 陈奕明
学号 20171308194
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试 2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第6章教材和课件,复习第6章内容 2. 复习第3章「栈」的知识
三、实验内容
教材133实验 5 ps: 1. 实验5相关提示见本文档最后一部分「附:实验5提示&说明」 2. 为提高实验效率,我已将实验 5 的程序框架准备好,可以从课程公邮→文件中心→ 实验文件夹,下载实验5程序框架。
四、实验结论
实验(1):
i.程序返回前,data段中的数据应为原有数据保持不变,即0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
ii.程序返回前,cs=076c、ss=076b、ds=076a
iii.设程序加载后,code段的段地址为X,则data段的段地址为x-20h,stack段的段地址为x-10h。
实验(2):
i.程序返回前,data段中的数据应为原有数据保持不变,即0123h,0456h
ii.程序返回前,cs=076c、ss=076b、ds=076a
iii.设程序加载后,code段的段地址为X,则data段的段地址为x-20h,stack段的段地址为x-10h。
iv.如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(n/16 + 1 )*16,即每个段中以16字节来对齐。
实验(3):
i.程序返回前,data段中的数据应为原有数据保持不变,即0123h,0456h
ii.程序返回前,cs=076A、ss=076E、ds=076D
iii.设程序加载后,code段的段地址为X,则data段的段地址为x+20h,stack段的段地址为x+30h。
问题(4):
经测试把第三个程序的“end start”改成“end”,经思考,结论如下:
1)"end start"的作用是指名程序的入口,“end”的功能是标志整个程序段的结束。
2)当各个程序中把“end start”改成“end”以后,程序即丧失程序入口语句
3)但是在2)的情况下第一个和第二个程序不能正常执行了,说明可能无法找到程序的入口,但是第三个程序却能正常执行,可见在这个程序中即使没有指明程
序的入口,它仍可从程序的入口开始执行程序,进行正确的操作。
4)只有程序三中的第一个机器码为代码,而前两个程序中的开始机器码都不是代码。
结论如下:
1)在指明程序入口的情况,程序从程序入口开始执行
2)在没有指明程序入口的情况下,系统默认从程序的第一个机器码执行
实验任务(5),要求在博客中给出如下内容:
(1) 汇编程序源代码:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c1 segment db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax,b mov es,ax mov cx,8 s1: mov al,ds:[bx] add es:[bx],al inc bx loop s1 mov cx,8 mov bx,0 mov ax,c1 mov ds,ax s2: mov al,es:[bx] add ds:[bx],al inc bx loop s2 mov ax,4c00h int 21h code ends end start
(2) 在debug中调试程序截图,截图中包括如下信息:
① 在实现数据相加前,逻辑段c的8个字节 ② 执行完实现加运算的代码后,逻辑段c的8个字节 (3) 根据①和②的调试,验证是否正确的实现数据相加。
由截图得,相加成功。
实验任务(6), 要求在博客中给出如下内容:
(1) 汇编程序源代码
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov bx,0 mov ax,b mov ss,ax mov sp,10h mov cx,8 s:push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
(2) 在debug中调试程序截图,截图中包括如下信息: ① 在push操作执行前,查看逻辑段b的8个字单元信息截图 ② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图
(3) 根据①和②的调试,验证是否正确的实现数据相加。
根据实验截图,实验成功,前8个字型数据已经逆序存储到b中。
五、总结与体会
本次实验中,重点我明白了X86cpu的段的概念:
x86的一个段的大小是16个字节,也就是说所有的段开始的位置必须是16的整数倍,因此一个段分配的时候大小是16的整数倍,
那么1-16个字节,段需要16字节17-32个字节需要32个字节一次类推,N个字节就需要(N/16+1)*16。
并且对loop循环指令以及多个程序段的源码执行文件和预分配空间命令有了进一步的了解。