计算机系统体系结构实验指导书Word文件下载.docx
《计算机系统体系结构实验指导书Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机系统体系结构实验指导书Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。
实验是一个重要的教学环节。
一般情况下学生能够重视实验环节,对于编写程序上机练习具
有一定的积极性。
但是容易忽略实验的总结,忽略实验报告的撰写。
对于一名大学生必须严
格训练分析总结能力、书面表达能力。
需要逐步培养书写科学实验报告以及科技论文的能力。
拿到一个题目,一般不要急于编程。
按照面向过程的程序设计思路(关于面向对象的训练将
在其它后继课程中进行),正确的方法是:
首先理解问题,明确给定的条件和要求解决的问
题,然后按照自顶向下,逐步求精,分而治之的策略,逐一地解决子问题。
一、实验报告的基本要求:
一般性、较小规模的上机实验题,必须遵循下列要求。
养成良好的习惯。
姓名班级学号日期题目
i.问题描述
ii.设计简要描述
iii.程序清单(带有必要的注释)
iv.结果分析(原始图示,测试数据与运行记录,分析正确性;
)
v.调试报告:
实验者必须重视最后这两个环节,否则等同于没有完成实验任务。
这里可以体现个人特
色、或创造性思维。
具体内容包括:
测试数据与运行记录;
调试中遇到的主要问题,自己是
如何解决的;
经验和体会等。
二、实验习报告的提高要求:
阶段性、较大规模的上机实验题,应该遵循下列要求。
养成科学的习惯。
(1)问题描述
(2)需求和规格说明
(3)描述问题,简述题目要解决的问题是什么。
规定软件做什么。
原题条件不足时补全。
(4)概要设计:
功能模块的划分,ADT
(5)详细设计:
每部分模块的设计,含数据结构的设计,算法的描述(流程图或PDL)
a.设计思想:
存储结构(题目中限定的要描述);
主要算法基本思想。
b.设计表示:
每个函数的头和规格说明;
列出每个函数所调用和被调用的函数,也
可以通过调用关系图表达。
(6)实现注释:
各项功能的实现程度、在完成基本要求的基础上还有什么功能。
(7)用户手册:
即使用说明书。
(8)调试报告:
调试过程中遇到的主要问题是如何解决的;
设计的回顾、讨论和分析;
时间复杂度、空间复杂度分析;
改进设想;
实验1对指令操作码进行霍夫曼编码
一、实验目的
1.了解和掌握指令编码的基本要求和基本原理
二、实验内容
1.使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果
以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
问题描述以及问题分析:
我们举例说明此问题,例如:
有一组指令的操作码共分七类,它们出现概率如
下表所示:
P1P2P3P4P5P6P7
0.450.300.150.050.030.010.01
对此组指令进行HUFFMAN编码正如下图所示:
0.45
0.30
0.15
0.05
0.03
0.01
0.01
01
0.02
01`
0.10
0.25
0.55
1.00
图1
最后得到的HUFFMAN编码如下表所示:
P1
P2
P3
P4
P5
P6
P7
010110
111011110111110111111
1
2
3
4
5
6
最短编码长度为:
H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.
要对指令的操作码进行HUFFMAN编码,只要根据指令的各类操作码的出现概率构造
HUFFMAN树再进行HUFFAM编码。
此过程的难点构造HUFFMAN树,进行HUFFAM编
码只要对你所生成的HUFFMAN树进行中序遍历即可完成编码工作。
三、实例
观察上图1,不难看出构造HUFFMAN树所要做的工作:
1、先对各指令操作码的出现
概率进行排序,构造一个有序链表。
2、再取出两个最小的概率节点相加,生成一个生的节
点加入到链表中,同时从两表中删除此两个节点。
3、在对链表进行排序,链表是否只有一
个节点,是则HUFFAN树构造完毕,否则继续做2的操作。
为此设计一个工作链表(链表
的元素时类,此类的功能相当结构。
)、HUFFMAN树节点、HUFFMAN编码表节点。
具体
如下:
//huff_mantreepoint;
classhuff_p{
public:
huff_p*r_child;
//大概率的节点,即右子节点;
huff_p*l_child;
//小概率的节点,即左子节点;
charop_mask[3];
//指令标号;
floatp;
//指令使用概率;
};
//worklinkpoint
classf_min_p{
f_min_p*next;
floatp;
huff_p*huf_p;
/huff_mancodepoint
classhuff_code{
huff_code*next;
charop_mask[3];
charcode[N];
//huffman编码;
函数说明:
f_min_p*input_instruct_set();
//输入指令集子模块;
huff_p*creat_huffman_tree(f_min_p*head);
//构造huffman树;
f_min_p*fin_min(f_min_p*h);
//在工作链表中寻找最小概率节点函数。
f_min_p*del_min(f_min_p*h,f_min_p*p);
//在工作链表中删除最小概率节点函数。
voidinsert_n(f_min_p*h,f_min_p*p);
//在工作链表中插入两个最小概率节点生成的节点函
数。
huff_p*creat_huffp(f_min_p*p);
//生成HUFFMAN节点。
voidcreat_huffman_code(huff_p*h1,huff_code*h);
//生成huffman编码;
voidr_find(huff_p*p1,charcode[],inti,huff_code*h);
//遍历HUFFMAN树生成指令操作码的HUFFMAN编码。
voidoutput_huffman(huff_code*head);
//输出huffman编码;
voidcal_sort_length(huff_code*head);
//计算指令用huffman编码的平均编码字长
程序清单及注释:
#include<
iostream.h>
math.h>
#defineN8
//findtwominprogram;
//huff_mantreepont;
//大概率的节点;
//小概率的节点;
//huff_mancode
voidmain()
{
f_min_p*h,*h1;
huff_p*root;
huff_code*head,*pl;
int
h=input_instruct_set();
/*
p1=h;
while(p1)
cout<
<
p1->
p<
'
'
;
p1=p1->
next;
}
*/
h1=h;
root=creat_huffman_tree(h1);
head=newhuff_code;
head->
next=NULL;
creat_huffman_code(root,head);
output_huffman(head);
cal_sort_length(head);
pl=head->
while(pl)
deletehead;
head=pl;
pl=pl->
f_min_p*input_instruct_set()
f_min_p*head;
f_min_p*h;
h=newf_min_p;
h->