电子科技大学软件开发环境实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Huffman 编码的基本原理
本实验要求使用 Huffman 编码算法,实现对文件的压缩和解压。因此,我们首先介绍 huffman 的编码算法。
Huffman 编码是一种可变长编码方式,是由美国数学家 David Huffman 创立的,是二叉 树的一种特殊转化形式。编码的基本原理是:将使用次数多的代码转换成长度较短的编码,而 使用次数少的代码则可以使用较长的编码,并且保持编码的唯一可解性。
eax,1
002513B1 mov
dword ptr [ebp-8],eax
}
002513B4 jmp
0025139C
return 0;
002513B6 xor
eax,eax
在代码清单10当中,在地址0025138E处 mov
dword ptr [ebp-8],0将 [ebp-8] 设置为0,即将i设置为0;同理在地址
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
while()
A : cmp 操作数 1 操作数 2 while 循环结束条件做比较
jxx B
若不符合条件则,跳转到 B 处继续执行,若符合,则顺序执行循环体
{
循环体指令
....................................
....................................
..........................................
..........................................
}while( );
cmp 操作数1 操作数2 do------while循环 条件判断 语句
jxx A 如果符合条件的话,就跳转到A处的循环体部分开始执行,否则继续向下执行
00251395处 mov
dword ptr [ebp-14h],0 将[ebp-14]设置为0,即将j设置为0;
在地址0025139C处 cmp
dword ptr [ebp-8],0Ah ,将i的值与10做比较,在地址002513A0 处
jge
002513B6 如果i小于10,则继续向下执行,若i>=10 则跳转到 002513B6 处执行(即返回语句),若继续向下执
{
.................................
}
else
jmp 整个多分支流程语句后的指令地址
{
..................................
}
循环的反汇编
通过实验指导书当中给出的代码清单 9 的反汇编结果和分析,给出 for 循环反汇编代码的 规律如下:
四、实验目的:
本实验总体目的是,通过使用 Visual Studio 2008 查看函数调用时参数、局部变量等在 栈上的分布情况,以达到掌握函数调用时栈帧布局的目的。
六、实验器材(设备、元器件):
PC 机,VS 2008 软件平台。
七、实验步骤:
在源文件中,编写如下代码。
在源文件中,编写如下代码。 void f() { } int main() {
C:\> –c uncompress_filename compress_filename 上述命令中,是程序名,-c 表示要进行压缩。uncompress_filename 是要压缩的文件名, 可以包含路径信息,而 compress_filename 是压缩之后的文件名,同样可以包含路径信息。用 户可以通过如下命令进行解压: C:\> –u compress_filename uncompress_filename 上述命令中,-u 表示要执行解压命令。compress_filename 是要解压的文件名,可以包含 路径信息;uncompress_filename 就是解压后所得到的文件,同样可以包含路径信息。 提示:在实现程序时,需要考虑如何存储 huffman 树或者编码表或者词频表等等。 本实验要求实现两个版本的程序,一是 C 语言版本的,二是 C++版本的。对这两个版本的 要求如下: 对于每一个版本的程序,需要在实验报告中给出函数调用关系图、流程处理关系图以
0019139C 这条指令当中,如果操作数1 即i 小于操作数2 即 10,就跳转到0019139C
地址处继续执行,否则向下继续执行。
do -while 循环的反汇编代码规律:
do
{ 循环体指令代码
A:..........................................
..........................................
}
else if( )
cmp 操作数 1 操作数 2
jxx 地址(如果不符合 if 条件就跳转到下一个 if 条件处再进行比较)
{
................................
jmp 整个多分支流程语句后的指令地址
}
else if ( )
cmp 操作数 1 操作数 2
jxx 地址(如果不符合 if 条件就跳转到 else 条件处再进行比较)
....................................
} jmp A 跳转到 A 处继续执行 B:....................................
代码清单 11
int _tmain(int argc, _TCHAR* argv[])
{
int j = 0;
int i = 0;
swap() isInNode()
powgmegteyS(tu)SmumByBtietss(())
else if( )
cmp 操作数 1 操作数 2
jxx 地址(如果不符合 if 条件就跳转到下一个 if 条件处再进行比较)
{
................................
jmp 整个多分支流程语句后的指令地址
}
while(i<10);
001913AE cmp
dword ptr [ebp-14h],0Ah
001913B2 jl
0019139C
return 0;
001913B4 xor
eax,eax
}
在代码清单11当中,在地址0019138E处将[ebp-8] 设置为0,即将j设置为0,在地址00191395处,将00191395设置为0,即将i
程序实现是否考虑了大文件情况
六、实验器材(设备、元器件):
PC 机,vs 2008 软件平台。
七、实验数据及结果分析:
代码见附件。
huffmanForC
文件中函数列表如下:
......... ........... #sum_bit##count# */
void freToFile(int code[],HCode *HC)
指导书试验原理部分较多,在这里就不做粘贴复制了。
四、实验目的:
本实验总体目的是,通过使用 huffman 编码算法从而实现文件的压缩和解压,以达到使学 生掌握并灵活运用分割函数的三项原则。
五、实验内容:
本实验要求实现一个 exe 程序。这个程序按照 huffman 编码方式,同时包含了压缩功能和 解压功能。用户通过以下命令进行压缩:
for(int i = 0;i<10;i++) {
定义 i 变量,并进行初始化指令代码 jmp xxx 跳转到 A 处执行
B:执行计数变量递增操作 1.将变量 i mov 到 eax 处 2.eax 里内容递增 1 3.再将 eax 里面内容 mov 到 i 的变量里 A:cmp 操作数 1 操作数 2 与循环结束条件做比较指令代码 jxx xxx 如果仍旧满足条件,向下执行;否则跳转到 C 处向下执行
行,则002513A2 002513A5 002513A8 三地址处的指令对j进行加一操作,002513AB
002513AE 002513B1 对i进行加一操作;在 002513B4 jmp
0025139C 跳转回cmp的指令处继续执行。
通过代码清单10的反汇编结果 ,while语句的反汇编代码规律
f(); return 0;
设置为0. 在地址0019139C 0019139F 001913A2 三个地址处执行j增1的操作,在001913A5 001913A8 001913AB 三个地址处
执行i增1的操作。在地址001913AE 处执行循环条件比较指令
cmp
dword ptr [ebp-14h],0Ah
在接下来的001913B2 jl
及它们的文字说明等内容; 对于每一个版本的程序,都需要在实验报告中给出源代码。为了便于查重,代码中注
释的比例要占到总行数的 20%; C++版本的程序,需要给出类关系图。 实验报告的评分标准,包括以下几个方面: 实验报告是否规范 实验报告内容是否详实 实验报告中是否包含了函数调用图、流程图、类图以及它们的文字说明 实验报告中的代码注释是否达到要求 程序是否正确无误 程序是否严格按照分函数的原则编写 C++版本的程序类关系的耦合度如何
电子科技大学
实验报告
学生姓名:郭小明
学 号:
一、实验室名称: 主楼 A2-412
二、实验项目名称:
软件开发环境试验-----Huffman 编码实验
三、实验原理:
分割函数的三项原则
分割函数的三项原则包括:与其写注释,不如写函数;重复就是罪恶;函数不要超过 50 行至 70 行。
关于分割函数三原则的具体含义,请见教材和课堂教学 PPT 关于电话本的内容。这里不再 赘述。
002513A0 jge
002513B6
{
j++;
002513A2 mov
eax,dword ptr [ebp-14h]
002513A5 add
eax,1
002513A8 mov
dword ptr [ebp-14h],eax
i++;
002513AB mov
eax,dword ptr [ebp-8]
002513AE add
电子科技大学
实验报告
学生姓名:郭小明 一、实验室名称: 主楼 A2-412
学 号:
二、实验项目名称:软件开发环境实验三:函数调用栈帧布局
三、实验原理: 编译器对函数调用的支持,通常情况下都会使用栈。例如使用栈传递传参,
保存函数返回地址。另外,局部变量也通常位于栈上。Visual Studio 2008 为 了防止栈上局部数组溢出,又采取了特殊的保护措施。本实验就需要通过观 察栈帧布局,来了解这些保护措施。本实验的环境是 Visual Studio 2008。
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)
0025139C cmp
dword ptr [ebp-8],0Ah
循环体指令代码
.....................
..................... jmp xxx 跳转到 B 处执行
}
C:
代码清单 10
while循环的代码示例: int _tmain(int argc, _TCHAR* argv[]) {
int i = 0; int j = 0; while(i<10) {
CH类onutfrfomla类nTree.jm.类..p.......HC.整.uo.f.df.个m.e..a类.多.n.N.分.o..d.支.ec.c.输agf类r流furlceerWeo入n输etaFmHc程Tetroeo-入iuopugHmFfm语hrfi命-uelmptcFef(sr句ma(is命a令el)_rensagf(后s令Cn)iv_lo[Tef2dr的(ile)]ee)e((指)()) 令地址 }
do
{
j++;
i++;
}
while(i<10);
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
本实验要求使用 Huffman 编码算法,实现对文件的压缩和解压。因此,我们首先介绍 huffman 的编码算法。
Huffman 编码是一种可变长编码方式,是由美国数学家 David Huffman 创立的,是二叉 树的一种特殊转化形式。编码的基本原理是:将使用次数多的代码转换成长度较短的编码,而 使用次数少的代码则可以使用较长的编码,并且保持编码的唯一可解性。
eax,1
002513B1 mov
dword ptr [ebp-8],eax
}
002513B4 jmp
0025139C
return 0;
002513B6 xor
eax,eax
在代码清单10当中,在地址0025138E处 mov
dword ptr [ebp-8],0将 [ebp-8] 设置为0,即将i设置为0;同理在地址
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
while()
A : cmp 操作数 1 操作数 2 while 循环结束条件做比较
jxx B
若不符合条件则,跳转到 B 处继续执行,若符合,则顺序执行循环体
{
循环体指令
....................................
....................................
..........................................
..........................................
}while( );
cmp 操作数1 操作数2 do------while循环 条件判断 语句
jxx A 如果符合条件的话,就跳转到A处的循环体部分开始执行,否则继续向下执行
00251395处 mov
dword ptr [ebp-14h],0 将[ebp-14]设置为0,即将j设置为0;
在地址0025139C处 cmp
dword ptr [ebp-8],0Ah ,将i的值与10做比较,在地址002513A0 处
jge
002513B6 如果i小于10,则继续向下执行,若i>=10 则跳转到 002513B6 处执行(即返回语句),若继续向下执
{
.................................
}
else
jmp 整个多分支流程语句后的指令地址
{
..................................
}
循环的反汇编
通过实验指导书当中给出的代码清单 9 的反汇编结果和分析,给出 for 循环反汇编代码的 规律如下:
四、实验目的:
本实验总体目的是,通过使用 Visual Studio 2008 查看函数调用时参数、局部变量等在 栈上的分布情况,以达到掌握函数调用时栈帧布局的目的。
六、实验器材(设备、元器件):
PC 机,VS 2008 软件平台。
七、实验步骤:
在源文件中,编写如下代码。
在源文件中,编写如下代码。 void f() { } int main() {
C:\> –c uncompress_filename compress_filename 上述命令中,是程序名,-c 表示要进行压缩。uncompress_filename 是要压缩的文件名, 可以包含路径信息,而 compress_filename 是压缩之后的文件名,同样可以包含路径信息。用 户可以通过如下命令进行解压: C:\> –u compress_filename uncompress_filename 上述命令中,-u 表示要执行解压命令。compress_filename 是要解压的文件名,可以包含 路径信息;uncompress_filename 就是解压后所得到的文件,同样可以包含路径信息。 提示:在实现程序时,需要考虑如何存储 huffman 树或者编码表或者词频表等等。 本实验要求实现两个版本的程序,一是 C 语言版本的,二是 C++版本的。对这两个版本的 要求如下: 对于每一个版本的程序,需要在实验报告中给出函数调用关系图、流程处理关系图以
0019139C 这条指令当中,如果操作数1 即i 小于操作数2 即 10,就跳转到0019139C
地址处继续执行,否则向下继续执行。
do -while 循环的反汇编代码规律:
do
{ 循环体指令代码
A:..........................................
..........................................
}
else if( )
cmp 操作数 1 操作数 2
jxx 地址(如果不符合 if 条件就跳转到下一个 if 条件处再进行比较)
{
................................
jmp 整个多分支流程语句后的指令地址
}
else if ( )
cmp 操作数 1 操作数 2
jxx 地址(如果不符合 if 条件就跳转到 else 条件处再进行比较)
....................................
} jmp A 跳转到 A 处继续执行 B:....................................
代码清单 11
int _tmain(int argc, _TCHAR* argv[])
{
int j = 0;
int i = 0;
swap() isInNode()
powgmegteyS(tu)SmumByBtietss(())
else if( )
cmp 操作数 1 操作数 2
jxx 地址(如果不符合 if 条件就跳转到下一个 if 条件处再进行比较)
{
................................
jmp 整个多分支流程语句后的指令地址
}
while(i<10);
001913AE cmp
dword ptr [ebp-14h],0Ah
001913B2 jl
0019139C
return 0;
001913B4 xor
eax,eax
}
在代码清单11当中,在地址0019138E处将[ebp-8] 设置为0,即将j设置为0,在地址00191395处,将00191395设置为0,即将i
程序实现是否考虑了大文件情况
六、实验器材(设备、元器件):
PC 机,vs 2008 软件平台。
七、实验数据及结果分析:
代码见附件。
huffmanForC
文件中函数列表如下:
......... ........... #sum_bit##count# */
void freToFile(int code[],HCode *HC)
指导书试验原理部分较多,在这里就不做粘贴复制了。
四、实验目的:
本实验总体目的是,通过使用 huffman 编码算法从而实现文件的压缩和解压,以达到使学 生掌握并灵活运用分割函数的三项原则。
五、实验内容:
本实验要求实现一个 exe 程序。这个程序按照 huffman 编码方式,同时包含了压缩功能和 解压功能。用户通过以下命令进行压缩:
for(int i = 0;i<10;i++) {
定义 i 变量,并进行初始化指令代码 jmp xxx 跳转到 A 处执行
B:执行计数变量递增操作 1.将变量 i mov 到 eax 处 2.eax 里内容递增 1 3.再将 eax 里面内容 mov 到 i 的变量里 A:cmp 操作数 1 操作数 2 与循环结束条件做比较指令代码 jxx xxx 如果仍旧满足条件,向下执行;否则跳转到 C 处向下执行
行,则002513A2 002513A5 002513A8 三地址处的指令对j进行加一操作,002513AB
002513AE 002513B1 对i进行加一操作;在 002513B4 jmp
0025139C 跳转回cmp的指令处继续执行。
通过代码清单10的反汇编结果 ,while语句的反汇编代码规律
f(); return 0;
设置为0. 在地址0019139C 0019139F 001913A2 三个地址处执行j增1的操作,在001913A5 001913A8 001913AB 三个地址处
执行i增1的操作。在地址001913AE 处执行循环条件比较指令
cmp
dword ptr [ebp-14h],0Ah
在接下来的001913B2 jl
及它们的文字说明等内容; 对于每一个版本的程序,都需要在实验报告中给出源代码。为了便于查重,代码中注
释的比例要占到总行数的 20%; C++版本的程序,需要给出类关系图。 实验报告的评分标准,包括以下几个方面: 实验报告是否规范 实验报告内容是否详实 实验报告中是否包含了函数调用图、流程图、类图以及它们的文字说明 实验报告中的代码注释是否达到要求 程序是否正确无误 程序是否严格按照分函数的原则编写 C++版本的程序类关系的耦合度如何
电子科技大学
实验报告
学生姓名:郭小明
学 号:
一、实验室名称: 主楼 A2-412
二、实验项目名称:
软件开发环境试验-----Huffman 编码实验
三、实验原理:
分割函数的三项原则
分割函数的三项原则包括:与其写注释,不如写函数;重复就是罪恶;函数不要超过 50 行至 70 行。
关于分割函数三原则的具体含义,请见教材和课堂教学 PPT 关于电话本的内容。这里不再 赘述。
002513A0 jge
002513B6
{
j++;
002513A2 mov
eax,dword ptr [ebp-14h]
002513A5 add
eax,1
002513A8 mov
dword ptr [ebp-14h],eax
i++;
002513AB mov
eax,dword ptr [ebp-8]
002513AE add
电子科技大学
实验报告
学生姓名:郭小明 一、实验室名称: 主楼 A2-412
学 号:
二、实验项目名称:软件开发环境实验三:函数调用栈帧布局
三、实验原理: 编译器对函数调用的支持,通常情况下都会使用栈。例如使用栈传递传参,
保存函数返回地址。另外,局部变量也通常位于栈上。Visual Studio 2008 为 了防止栈上局部数组溢出,又采取了特殊的保护措施。本实验就需要通过观 察栈帧布局,来了解这些保护措施。本实验的环境是 Visual Studio 2008。
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)
0025139C cmp
dword ptr [ebp-8],0Ah
循环体指令代码
.....................
..................... jmp xxx 跳转到 B 处执行
}
C:
代码清单 10
while循环的代码示例: int _tmain(int argc, _TCHAR* argv[]) {
int i = 0; int j = 0; while(i<10) {
CH类onutfrfomla类nTree.jm.类..p.......HC.整.uo.f.df.个m.e..a类.多.n.N.分.o..d.支.ec.c.输agf类r流furlceerWeo入n输etaFmHc程Tetroeo-入iuopugHmFfm语hrfi命-uelmptcFef(sr句ma(is命a令el)_rensagf(后s令Cn)iv_lo[Tef2dr的(ile)]ee)e((指)()) 令地址 }
do
{
j++;
i++;
}
while(i<10);
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