电子科技大学软件开发环境实验报告.pdf
《电子科技大学软件开发环境实验报告.pdf》由会员分享,可在线阅读,更多相关《电子科技大学软件开发环境实验报告.pdf(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 电子科技大学软件开发环境实验报告 The document was prepared on January 2,2021 电 子 科 技 大 学 实 验 报 告 学生姓名:郭小明 学 号:一、实验室名称:主楼 A2-412 二、实验项目名称:软件开发环境试验-Huffman编码实验 三、实验原理:分割函数的三项原则 分割函数的三项原则包括:与其写注释,不如写函数;重复就是罪恶;函数不要超过50行至 70行。关于分割函数三原则的具体含义,请见教材和课堂教学PPT关于电话本的内容。这里不再赘述。Huffman 编码的基本原理 本实验要求使用 Huffman编码算法,实现对文件的压缩和解压。因此,
2、我们首先介绍huffman 的编码算法。Huffman 编码是一种可变长编码方式,是由美国数学家 David Huffman 创立的,是二叉树的一种特殊转化形式。编码的基本原理是:将使用次数多的代码转换成长度较短的编码,而使用次数少的代码则可以使用较长的编码,并且保持编码的唯一可解性。指导书试验原理部分较多,在这里就不做粘贴复制了。四、实验目的:本实验总体目的是,通过使用 huffman编码算法从而实现文件的压缩和解压,以达到使学生掌握并灵活运用分割函数的三项原则。五、实验内容:本实验要求实现一个 exe程序。这个程序按照 huffman编码方式,同时包含了压缩功能和解压功能。用户通过以下命令
3、进行压缩:C:c uncompress_filename compress_filename 上述命令中,是程序名,-c表示要进行压缩。uncompress_filename 是要压缩的文件名,可以包含路径信息,而 compress_filename是压缩之后的文件名,同样可以包含路径信息。用户可以通过如下命令进行解压:C:u compress_filename uncompress_filename 上述命令中,-u表示要执行解压命令。compress_filename 是要解压的文件名,可以包含路径信息;uncompress_filename就是解压后所得到的文件,同样可以包含路径信息。提
4、示:在实现程序时,需要考虑如何存储 huffman树或者编码表或者词频表等等。本实验要求实现两个版本的程序,一是 C 语言版本的,二是 C+版本的。对这两个版本的要求如下:对于每一个版本的程序,需要在实验报告中给出函数调用关系图、流程处理关系图以及它们的文字说明等内容;对于每一个版本的程序,都需要在实验报告中给出源代码。为了便于查重,代码中注释的比例要占到总行数的 20%;C+版本的程序,需要给出类关系图。实验报告的评分标准,包括以下几个方面:实验报告是否规范 实验报告内容是否详实 实验报告中是否包含了函数调用图、流程图、类图以及它们的文字说明 实验报告中的代码注释是否达到要求 程序是否正确无
5、误 程序是否严格按照分函数的原则编写 C+版本的程序类关系的耦合度如何 程序实现是否考虑了大文件情况 六、实验器材(设备、元器件):PC 机,vs 2008软件平台。七、实验数据及结果分析:代码见附件。huffmanForC 文件中函数列表如下:.#sum_bit#count#*/void freToFile(int code,HCode*HC).jmp 整个多分支流程语句后的指令地址 else if()cmp 操作数 1 操作数 2 jxx 地址(如果不符合 if 条件就跳转到下一个 if 条件处再进行比较).jmp 整个多分支流程语句后的指令地址 else if()cmp 操作数 1 操作
6、数 2 jxx 地址(如果不符合 if 条件就跳转到下一个 if 条件处再进行比较).jmp 整个多分支流程语句后的指令地址 else if()cmp 操作数 1 操作数 2 jxx 地址(如果不符合 if 条件就跳转到 else 条件处再进行比较).else jmp 整个多分支流程语句后的指令地址 .循环的反汇编 通过实验指导书当中给出的代码清单 9 的反汇编结果和分析,给出 for 循环反汇编代码的规律如下:for(int i=0;i10;i+)定义 i 变量,并进行初始化指令代码 jmp xxx 跳转到 A 处执行 输入-c命令 calWeight(argv2createHufmanTr
7、ee()getHuffmanCode()compress_file()freToFile()输入-u 命令 freFromFile()uncompress_file()swap()powmy()getSumBits()getSumBytes()isInNode()HuffmanTree类类 Code类 HuffmanNode类 Control 类 B:执行计数变量递增操作 1.将变量 i mov 到 eax 处 2.eax 里内容递增 1 3.再将 eax 里面内容 mov 到 i 的变量里 A:cmp 操作数 1 操作数 2 与循环结束条件做比较指令代码 jxx xxx 如果仍旧满足条件,向
8、下执行;否则跳转到 C 处向下执行 循环体指令代码 .jmp xxx 跳转到 B 处执行 C:代码清单 10 while循环的代码示例:int _tmain(int argc,_TCHAR*argv)int i=0;int j=0;while(i10)j+;i+;return 0;代码清单 10的反汇编结果:int i=0;0025138E mov dword ptr ebp-8,0 int j=0;00251395 mov dword ptr ebp-14h,0 while(i=10 则跳转到 002513B6 处执行(即返回语句),若继续向下执行,则002513A2 002513A5 00
9、2513A8 三地址处的指令对j进行加一操作,002513AB 002513AE 002513B1 对i进行加一操作;在 002513B4 jmp 0025139C 跳转回cmp的指令处继续执行。通过代码清单10的反汇编结果,while语句的反汇编代码规律 while()A :cmp 操作数 1 操作数 2 while循环结束条件做比较 jxx B 若不符合条件则,跳转到 B 处继续执行,若符合,则顺序执行循环体 循环体指令.jmp A 跳转到 A处继续执行 B:.代码清单 11 int _tmain(int argc,_TCHAR*argv)int j=0;int i=0;do j+;i+;
10、while(i10);return 0;代码清单11 的反汇编结果:int j=0;0019138E mov dword ptr ebp-8,0 int i=0;00191395 mov dword ptr ebp-14h,0 do j+;0019139C mov eax,dword ptr ebp-8 0019139F add eax,1 001913A2 mov dword ptr ebp-8,eax i+;001913A5 mov eax,dword ptr ebp-14h 001913A8 add eax,1 001913AB mov dword ptr ebp-14h,eax whi
11、le(i窗口-内存)可画出栈帧的布局,即图2。图 2 无局部变量时的布局 从图2可以知道,即使没有任何局部变量,栈上仍然有0 xc0个字节的0 xcc存在。这个是为了检测是否有溢出而写的。代码清单2的解释:在008D13A0地址处将ebp的值压入堆栈,并在 008D13A1 地址处将现在栈顶esp 的值赋给ebp,然后再008D13A3 处将esp的值减去0C0h,此时栈又向下面生长了0C0h个单位。然后在008D13A9 008D13AA 008D13AB 三个地址处依次将 ebx,esi,edi三个值压入堆栈。008D13AC lea edi,ebp-0C0h,在008D13AC地址处,将
12、ebp-0C0h这个地址值赋给edi。008D13B2 mov ecx,30h 将ecx的值赋为30h,在008D13B7 mov eax,0CCCCCCCCh,处将eax的值赋值为0CCCCCCCCh,然 后 执 行 stos指令,将 eax的 值放在edi中,之 后在这里将 edi的值加4。rep stos的含义就 是 循 环 执 行 stos,直到 ecx为 0,每次循环 ecx都会减1。然后 edi,esi,ebx依次出栈,再 之后将原 来保存在 ebp中的 esp的值重新赋 给 esp,在将 ebp出栈,就还原了现场。在源文件中,编写如下代码:#include void f()返回地
13、址前帧 ebp的值.0 xcccccccc.ebp共有 0 xc0 个0 xcc,即 0 x30 个0 xcccccccc原ebx 的值原esi的值原edi的值 int i=0;int _tmain(int argc,_TCHAR*argv)f();return 0;并且经过反汇编获得如下代码清单 4:void f()002513A0 push ebp 002513A1 mov ebp,esp 002513A3 sub esp,0CCh 002513A9 push ebx 002513AA push esi 002513AB push edi 002513AC lea edi,ebp-0CCh
14、 002513B2 mov ecx,33h 002513B7 mov eax,0CCCCCCCCh 002513BC rep stos dword ptr es:edi int i=0;002513BE mov dword ptr i,0 002513C5 pop edi 002513C6 pop esi 002513C7 pop ebx 002513C8 mov esp,ebp 002513CA pop ebp 002513CB ret 在实验报告中,需要给出代码清单 4 中反汇编代码的解释。根据代码清单 4,以及内存映像(调式-窗口-内存)可画出栈帧的布局,即图3。图 3 只有一个整型局部
15、变量时的布局 从图 3可知,当增加一个 int i 时,栈帧大小增加了 12 字节,即 0 x0c。这包括 i 本身的 4字节,然后是 i 上方的 4 字节 0 xcccccccc和 i 下方的 4 字节 0 xcccccccc。代码清单4 的解释:代码清单4的实现步骤总体类似于代码清单2,也是首先将ebp压栈,然后将esp保存进ebp,有所变化的就是这次是将esp的值减去0CCh,比上一次无局部变量的时候多了0Ch,然后仍旧是压ebx,esi,edi的值入栈,之后仍旧是将002B13AC lea edi,ebp-0CCh ebp-0CCh地址值赋给edi,之后将033h赋值给ecx,之后执行
16、stos指令,仍旧是将ebp与ebx之间的堆栈字节通通赋值为0 xcc。在之后将i的值赋值为0,然后同样是出栈和恢复地址。在实验报告中,需要分别给出只有一个char类型局部变量、只有一个short类型局部变量,以及只有一个double类型局部变量时栈帧的布局。即代码清单5、代码清单6、代码清单7中f函数所对应的栈帧布局。下面是char i=0;的反汇编代码清单5:(注意右键显示符号名)void f()返回地址前帧ebp的值.0 xcccccccc.ebp共有0 xc0个0 xcc原ebx的值原esi的值原edi的值0 xccccccccebp-4iebp-80 xccccccccebp-0 x
17、0c共有0 xcc个字节00AE13A0 push ebp 00AE13A1 mov ebp,esp 00AE13A3 sub esp,0CCh 00AE13A9 push ebx 00AE13AA push esi 00AE13AB push edi 00AE13AC lea edi,ebp-0CCh 00AE13B2 mov ecx,33h 00AE13B7 mov eax,0CCCCCCCCh 00AE13BC rep stos dword ptr es:edi char i=0;00AE13BE mov byte ptr i,0 00AE13C2 pop edi 00AE13C3 po
18、p esi 00AE13C4 pop ebx 00AE13C5 mov esp,ebp 00AE13C7 pop ebp 00AE13C8 ret 返回地址 前帧ebp的值 0 xcc cc cc cc cc i 0 xcc cc cc cc cc cc cc 0 xcc cc cc cc 原ebx的值 原esi的值 原edi的值 下面是short i=0;的反汇编代码清单6:void f()012313A0 push ebp 012313A1 mov ebp,esp 012313A3 sub esp,0CCh 012313A9 push ebx 012313AA push esi 01231
19、3AB push edi 012313AC lea edi,ebp+FFFFFF34h 012313B2 mov ecx,33h ebp ebp-4 ebp-5 ebp-共有 0 xC0 个oxcch 共有 0 xcc个字节 012313B7 mov eax,0CCCCCCCCh 012313BC rep stos dword ptr es:edi short i=0;012313BE xor eax,eax 012313C0 mov word ptr ebp-10h,ax 012313C4 pop edi 012313C5 pop esi 012313C6 pop ebx 012313C7
20、mov esp,ebp 012313C9 pop ebp 012313CA ret 返回地址 前帧ebp的值 0 xcc cc cc cc 0 xcc cc cc cc i 0 xcc cc 0 xcc cc cc cc 原ebx的值 原esi的值 原edi的值 下面是double i=0;的反汇编代码清单7:void f()013C13A0 push ebp 013C13A1 mov ebp,esp 013C13A3 sub esp,0CCh 013C13A9 push ebx 013C13AA push esi 013C13AB push edi 013C13AC lea edi,ebp+
21、FFFFFF34h 013C13B2 mov ecx,33h 013C13B7 mov eax,0CCCCCCCCh 013C13BC rep stos dword ptr es:edi double i=0;013C13BE fldz 013C13C0 fstp qword ptr ebp-1Ch 013C13C3 pop edi ebp ebp-8 ebp-10 ebp-共有 0 xC0 个oxcch 共有 0 xcc个字节 013C13C4 pop esi 013C13C5 pop ebx 013C13C6 mov esp,ebp 013C13C8 pop ebp 013C13C9 re
22、t 返回地址 前帧ebp的值 0 xcc cc cc cc cc i 0 xcc cc cc cc 原ebx的值 原esi的值 原edi的值 在源文件中,编写代码清单 8:void f()char i=0;int j=0;int _tmain(int argc,_TCHAR*argv)f();return 0;并进行反汇编得到代码清单9:void f()00D813A0 push ebp 00D813A1 mov ebp,esp 00D813A3 sub esp,0D8h 00D813A9 push ebx 00D813AA push esi 00D813AB push edi 00D813A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子科技大学 软件 开发 环境 实验 报告
限制150内