电子科技大学软件开发环境实验报告.pdf

上传人:l**** 文档编号:73656516 上传时间:2023-02-21 格式:PDF 页数:26 大小:1.12MB
返回 下载 相关 举报
电子科技大学软件开发环境实验报告.pdf_第1页
第1页 / 共26页
电子科技大学软件开发环境实验报告.pdf_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《电子科技大学软件开发环境实验报告.pdf》由会员分享,可在线阅读,更多相关《电子科技大学软件开发环境实验报告.pdf(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

23、C lea edi,ebp+FFFFFF28h 00D813B2 mov ecx,36h 00D813B7 mov eax,0CCCCCCCCh 00D813BC rep stos dword ptr es:edi char i=0;00D813BE mov byte ptr ebp-5,0 ebp ebp-共有 0 xC0 个oxcch ebp-4 共有 0 xcc个字节 int j=0;00D813C2 mov dword ptr ebp-14h,0 00D813C9 pop edi 00D813CA pop esi 00D813CB pop ebx 00D813CC mov esp,eb

24、p 00D813CE pop ebp 00D813CF ret 在实验报告中,需要给出代码清单 9 中反汇编代码的解释。根据代码清单 9,以及内存映像(调式-窗口-内存)可画出栈帧的布局,即图4。图 4 代码清单 9 对应的栈帧布局 从图 4可以看出,当增加一个局部变量时,这个局部变量的上方和下方都会填充若干个0 xcc字节。在实验报告中,完成下面几种情形的栈帧布局分析,并写出栈帧布局的规律。代码清单 9 的解释:首先将 ebp 压栈,然后将现在 esp(栈顶指针)的值赋给 ebp(保存原始现场),然后将 esp-0D8h,就是将栈又向下生长了 0D8h个单位,然后将 ebx,esi,edi

25、压栈,然后将 ebp-0D8h 的地址值赋给 edi,再将 ecx 赋为 36h,然后将 eax 赋值为 0CCCCCCCCh,之后执行stos指令,将这一段未被初始化的栈全部赋值为 0 xCCh.,然后将局部变量 char i=0,赋值(ebp-5),int i=0 赋值(ebp-14h),在之后,将 edi,esi,ebx 出栈,并且将 esp 还原为原来的 ebp的值(即还原现场)。void f()char i=0;short j=0;int _tmain(int argc,_TCHAR*argv)f();return 0;下面是代码清单 10 的反汇编代码:void f()00F613

26、A0 push ebp 00F613A1 mov ebp,esp 00F613A3 sub esp,0D8h 00F613A9 push ebx 00F613AA push esi 00F613AB push edi 00F613AC lea edi,ebp+FFFFFF28h 00F613B2 mov ecx,36h 00F613B7 mov eax,0CCCCCCCCh 00F613BC rep stos dword ptr es:edi char i=0;00F613BE mov byte ptr ebp-5,0 short j=0;00F613C2 xor eax,eax 00F613

27、C4 mov word ptr ebp-14h,ax 00F613C8 pop edi 00F613C9 pop esi 00F613CA pop ebx 00F613CB mov esp,ebp 00F613CD pop ebp 00F613CE ret 返回地址 前帧 ebp的值 0 xcccccccc i(1 个字节)0 xcc 0 xcc 0 xcc 0 xcccccccc 0 xcccccccc 0 xcc 0 xcc j(2 个字节)0 xcccccccc 0 xcccccccc(共计有0 xc0 个 0 xcc)原 ebx 的值 原 esi 的值 原 edi的值 void f()

28、char i=0;char j=0;int _tmain(int argc,_TCHAR*argv)f();return 0;下面是代码清单 11 的反汇编代码:void f()000213A0 push ebp 000213A1 mov ebp,esp 000213A3 sub esp,0D8h 000213A9 push ebx 000213AA push esi 000213AB push edi 000213AC lea edi,ebp+FFFFFF28h 000213B2 mov ecx,36h 000213B7 mov eax,0CCCCCCCCh 000213BC rep sto

29、s dword ptr es:edi char i=0;000213BE mov byte ptr ebp-5,0 char j=0;000213C2 mov byte ptr ebp-11h,0 000213C6 pop edi 000213C7 pop esi 000213C8 pop ebx 000213C9 mov esp,ebp 000213CB pop ebp 000213CC ret 返回地址 前帧 ebp的值 0 xcccccccc i 0 xcc 0 xcc 0 xcc 0 xcccccccc 0 xcccccccc j 0 xcc 0 xcc 0 xcc 0 xcccccc

30、cc 0 xcccccccc(共计有0 xc0 个 0 xcc)原 ebx 的值 原 esi 的值 原 edi的值 下面是代码清单 12;void f()char i=0;int j=0;short k=0;int _tmain(int argc,_TCHAR*argv)f();return 0;下面是代码清单 12 的反汇编代码 void f()00A313A0 push ebp 00A313A1 mov ebp,esp 00A313A3 sub esp,0E4h 返回地址前帧ebp的值.0 xcccccccc.ebp共有0 xc0个0 xcc原ebx的值原esi的值原edi的值0 xccc

31、cccccebp-4iebp-80 xccccccccebp-0 x10共有0 xec个字节0 xcc0 xcc0 xccebp-9ebp-0 x0cchar a20ebp-0 x140 xcccccccc0 xcccccccc安全cookie的异或运算结果ebp-0 x28ebp-0 x2c .(共计 0 xBC 个 0 xcc)原 ebx 的值 原 esi 的值 原 edi 的值#include void f()char a5;a0=0;int _tmain(int argc,_TCHAR*argv)f();return 0;程序清单 18 的反汇编代码:void f()00281A40

32、push ebp 00281A41 mov ebp,esp 00281A43 sub esp,0D4h 00281A49 push ebx 00281A4A push esi 00281A4B push edi 00281A4C lea edi,ebp-0D4h 00281A52 mov ecx,35h 00281A57 mov eax,0CCCCCCCCh 00281A5C rep stos dword ptr es:edi 00281A5E mov eax,dword ptr _security_cookie(28702Ch)00281A63 xor eax,ebp 00281A65 mo

33、v dword ptr ebp-4,eax char a5;a0=0;00281A68 mov byte ptr ebp-1Ch,0 00281A6C push edx 00281A6D mov ecx,ebp 00281A6F push eax 00281A70 lea edx,(281A90h)00281A76 call ILT+135(_RTC_CheckStackVars8)(28108Ch)00281A7B pop eax 00281A7C pop edx 00281A7D pop edi 00281A7E pop esi ebp-10h 共计有 0 xCC 个字节 00281A7F

34、 pop ebx 00281A80 mov ecx,dword ptr ebp-4 00281A83 xor ecx,ebp 00281A85 call ILT+25(_security_check_cookie4)(28101Eh)00281A8A mov esp,ebp 00281A8C pop ebp 00281A8D ret 返回地址 前帧 ebp 的值 安全 cookie 的异或运算结果 0 xcccccccc(0 x13h个cc)char a5(5 个字节)0 xcccccccc(共计 0 xB0个 0 xcc)原 ebx的值 原 esi 的值 原 edi的值#include vo

35、id f()char i5;char j7;i0=0;j0=0;int _tmain(int argc,_TCHAR*argv)f();return 0;说明何种情况下,才会有_security_cookie 的安全性检查 答:经过试验发现,在数组长度大于或者等于 5 个的情况下就会出现_security_cookie的安全性检查。在前面已经得出的栈帧布局规律基础之上,把局部数组的情况考虑进去,在实验报告中写出新的布局规律。答:在前面的栈帧布局规律的基础上加上局部数组之后,出现了如下变化:如果数组长度大于等于 5 的话,在前帧 ebp之后会存储 4 个字节的安全 cookie异或运算结果,用于

36、检查缓冲区溢出。ebp-1Ch 共计 0 xcc个字节 在存放局部数组的时候,与一般局部变量的存放情况不同,是单独开辟一块空间存放数组,且按照数组下标大小按照小下标对应小地址,大下标对应大地址的方式存储,并且在数组存放区域的前后各加上 4 个字节的 0 xcccccccc _RTC_CheckStackVars 的检查#include void f()char i5;cahr j7;i0=0;j0=0;int _tmain(int argc,_TCHAR*argv)f();return 0;代码清单19的反汇编代码:void f()00C91A40 push ebp 00C91A41 mov

37、ebp,esp 00C91A43 sub esp,0E4h /分配0E4h大小的栈空间 00C91A49 push ebx 00C91A4A push esi 00C91A4B push edi 00C91A4C lea edi,ebp-0E4h 00C91A52 mov ecx,39h 00C91A57 mov eax,0CCCCCCCCh 00C91A5C rep stos dword ptr es:edi 00C91A5E mov eax,dword ptr _security_cookie(0C9702Ch)/将security_cookie的值赋给eax 00C91A63 xor e

38、ax,ebp 00C91A65 mov dword ptr ebp-4,eax char i5;char j7;i0=0;00C91A68 mov byte ptr ebp-10h,0 j0=0;00C91A6C mov byte ptr ebp-20h,0 00C91A70 push edx 00C91A71 mov ecx,ebp 00C91A73 push eax 00C91A74 lea edx,(0C91A94h)00C91A7A call ILT+135(_RTC_CheckStackVars8)(0C9108Ch)00C91A7F pop eax 00C91A80 pop edx

39、 00C91A81 pop edi 00C91A82 pop esi 00C91A83 pop ebx 00C91A84 mov ecx,dword ptr ebp-4 00C91A87 xor ecx,ebp 00C91A89 call ILT+25(_security_check_cookie4)(0C9101Eh)00C91A8E mov esp,ebp 00C91A90 pop ebp 00C91A91 ret 返回地址 前帧 ebp的值 安全 cookie的异或运算结果 0 xcccccccc char i5 0 xcccccccc 0 xcccccccc char j7 0 xcc

40、cccccc 0 xcccccccc(共计有 0 xc0 个0 xcc)原 ebx 的值 原 esi 的值 原 edi 的值 程序解释:程序大体和前面的汇编代码格式相同,首先压榨 ebp,将 esp 的值赋值给 ebp寄存器,运行 stos 指令初始化栈空间,然后按汇编指令将指定的值进行初始化为 0,最后在出栈恢复现场。_RTC_CheckStackVars 函数的工作原理 012F4CF0 push ebp 012F4CF1 mov ebp,esp 012F4CF3 push ecx 012F4CF4 push ebx 012F4CF5 push esi 012F4CF6 mov ebx,e

41、dx ;参数(edx)送 ebx 012F4CF8 xor esi,esi ;esi 清零 012F4CFA mov dword ptr ebp-4,ecx ;送参数(ecx)到 ebp-4 012F4CFD cmp dword ptr ebx,esi ;取(ebx)值,即 f()中局部数组个数,与 esi(零值)比较 012F4CFF jle _RTC_CheckStackVars+52h(012F4D42h);若小或等(即无局部数组)跳 012F4D42h 012F4D01 push edi ;edi 入栈保存 012F4D02 xor edi,edi ;edi 清零 012F4D04 m

42、ov ecx,dword ptr ebx+4 ;(ebx+4)即局部数组信息首地址送ecx 012F4D07 mov eax,dword ptr frame ;frame 为 f()栈帧,送 eax 012F4D0A mov edx,dword ptr ecx+edi ;(ecx+edi)即局部数组信息首个数据送 edx 012F4D0D cmp dword ptr edx+eax-4,0CCCCCCCCh ;比较 i数组下方四字节与 0CCCCCCCh 012F4D15 jne _RTC_CheckStackVars+39h(012F4D29h);若不等,后面将调_RTC_StackFail

43、ure 012F4D17 mov eax,dword ptr ecx+edi+4 ;送数组长度到 eax 012F4D1B add eax,edx ;eax+edx 即 i数组首地址对 ebp 偏移加数组长度,即数组末尾之上四字节 012F4D1D mov edx,dword ptr frame ;f()栈帧送 edx 012F4D20 cmp dword ptr eax+edx,0CCCCCCCCh ;比较数组末尾之上四字节与 0CCCCCCCCh 012F4D27 je _RTC_CheckStackVars+49h(012F4D39h);若等,跳012F4D39h 012F4D29 pu

44、sh dword ptr ecx+edi+8 ;接上条语句,若不等,后面将调_RTC_StackFailure 012F4D2D mov eax,dword ptr ebp+4 012F4D30 push eax 012F4D31 call _RTC_StackFailure(012F11CCh)012F4D36 add esp,8 012F4D39 inc esi ;esi 增 1,以检查另一个局部数组 012F4D3A add edi,0Ch ;edi 偏移增加 12,以获取局部数组信息表中下一个数组信息 012F4D3D cmp esi,dword ptr ebx ;比较 esi 与局部

45、数组数目 012F4D3F jl _RTC_CheckStackVars+14h(012F4D04h);若小,跳012F4D04h,检查下一个数组 012F4D41 pop edi ;否则,之后将退出检查函数 012F4D42 pop esi 012F4D43 pop ebx 012F4D44 mov esp,ebp 012F4D46 pop ebp 012F4D47 ret 八、实验结论:通过本次试验,深刻理解了 Huffman 编码在解压缩领域上的利用,以及其具有的极大价值,了解了流程控制语句反汇编的结构特点,函数调用栈帧布局的相关规律,灵活的使用 VS 等编程开发工具进行学习编程的能力得到了提升。这是一次很有价值和具有深刻意义的实验课。谢谢实验指导老师的辛勤指导!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁