计算机体系结构实验报告.docx
- 文档编号:4539904
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:16
- 大小:22.52KB
计算机体系结构实验报告.docx
《计算机体系结构实验报告.docx》由会员分享,可在线阅读,更多相关《计算机体系结构实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
计算机体系结构实验报告
计算机体系结构
实验报告
专业计算机科学与技术
班级
学号
姓名
2010–6-8
实验一
对指令操作码进行霍夫曼编码
一、实验目的
了解和掌握指令编码的基本要求和基本原理
二、实验内容
1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果
以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
问题描述以及问题分析:
我们举例说明此问题,例如:
有一组指令的操作码共分七类,它们出现概率如
下表所示:
P1 P2 P3 P4 P5 P6 P7
0.45 0.30 0.15 0.05 0.03 0.01 0.01
对此组指令进行HUFFMAN 编码正如下图所示:
0 1
0 1`
0 1
0 1
0 1
0 1
0.45 0.30 0.15 0.05 0.03 0.01
0.02
0.05
0.10
0.25
0.55
1.00
0.01
图1
最后得到的HUFFMAN 编码如下表所示:
P1 P2 P3 P4 P5 P6 P7
0 10 110 1110 11110 111110 111111
1 2 3 4 5 6 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_man tree point;
class huff_p{
public:
huff_p* r_child; //大概率的节点,即右子节点;
huff_p* l_child; //小概率的节点,即左子节点;
c har op_mask[3]; //指令标号;
float p; //指令使用概率;
}; //work link point
class f_min_p{
public:
f_ min_p* next;
c har op_mask[3]; //指令标号;
float p; //指令使用概率;
huf f_p* huf_p;
};
/huff_man code point
class huff_code{
public:
huff_code* next;
float p;
char op_mask[3];
char code[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);//在工作链表中删除最小概率节点函数。
void insert _n(f_min_p* h,f_min_p* p);// 在工作链表中插入两个最小概率节点生成的节点函
数。
huff_p* cr eat_huffp(f_min_p* p);//生成HUFFMAN 节点。
void creat_huffman_code(huff_p* h1,huff_code* h);//生成huffman 编码;
void r_find(huff_p* p1,char code[],int i,huff_code* h);
//遍历HUFFMAN 树生成指令操作码的HUFFMAN 编码。
void output_huffman(huff_code* head);//输出huffman 编码;
void cal_sort_length(huff_code* head);//计算指令用huffman 编码的平均编码字长
程序清单及注释:
#include
#include
#define N 8
//find two min program;
//huff_man tree pont;
class huff_p{
public:
huff_p* r_child; //大概率的节点;
huff_p* l_child; //小概率的节点;
c har op_mask[3]; //指令标号;
float p; //指令使用概率;
};
class f_min_p{
public:
f_ min_p* next;
c har op_mask[3]; //指令标号;
float p; //指令使用概率;
huf f_p* huf_p;
}; //huff_man code
class huff_code{
public:
huff_code* next;
float p;
char op_mask[3];
char code[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);
void insert_n(f_min_p* h,f_min_p* p);
huff_p* cr eat_huffp(f_min_p* p);
void creat_huffman_code(huff_p* h1,huff_code* h);//生成huffman 编码;
void r_find(huff_p* p1,char code[],int i,huff_code* h);
void output_huffman(huff_code* head);//输出huffman 编码;
void cal_sort_length(huff_code* head);//计算指令用huffman 编码的平均编码字长
void main()
{ f_ min_p *h,*h1;
huf f_p *roo t;
huf f_code* head,*pl;
int i=0;
h=input_instruct_set(); /*
p1= h;
while(p 1)
{ c out<
p1= p1->next;
} */ h1=h;
ro ot=creat_huffman_tree(h1);
head=new huff_code;
hea d->next=NULL;
cre at_huffman_code(root,head);
output_huffman(head);
c al_sort_length(head);
pl= head->next;
while(p l)
{
del ete head;
hea d=pl;
p l=pl->next;
} } f_min_p* input_instruct_set()
{ f_ min_p* head;
f_ min_p* h;
h=n ew f_min_p;
h->next=NULL;
h->h uf_p=NULL;
hea d=h;
in t n;
cout<<" 请输入指令数:
";
cin>>n;
cout<<" 请输入指令标号:
";
ci n>>h->op_mask;
cout<<" 请输入指令的使用概率:
";
cin>>h-> p;
int i=0;
f_ min_p* point;
f_ min_p* p1=head;
for(;i poi nt=new f_min_p; cout<<"请输入指令标号: "; cin >>point->op_mask; poi nt->op_mask[2]='\0'; cout<<" 请输入指令的使用概率: "; cin >>point->p; poi nt->huf_p=NULL; poi nt->next=p1->next; p1-> next=point; p1= point; } return head; } huff_p* creat_huffman_tree(f_min_p* h) { f_m in_p *h1,*min1,*min2,*comb; huff_p* head,*rd,*ld,*parent; h1=h; m in1=fin_min(h1); l d=creat_huffp(min1); h1=del_min(h1,min1); if(h1->next) m in2=fin_min(h1); else m in2=h1; rd=creat_huf fp(min2); c omb=new f_min_p; c omb->next=NULL; com b->p=rd->p+ld->p; c omb->op_mask[0]='\0'; c omb->op_mask[1]='\0'; parent=creat_huffp(comb); i nsert_n(h1,comb); if(h1->next! =NULL) h1=del_min(h1,min2); parent->l_child=ld; parent->r_child=rd; c omb->huf_p=parent; head=parent; in t i=0; c out< wh ile(h1->next! =NULL) { m in1=fin_min(h1); if(m in1->huf_p==NULL) { ld=creat_huffp(min1); } else { ld=min1->huf_p; } h1=del_min(h1,min1); if(h1->next) min2=fin_min(h1); else min2=h1; if(m in2->huf_p==NULL) { rd=creat_huffp(min2); } else { rd=min2->huf_p; } c omb=new f_min_p; c omb->next=NULL; com b->p=rd->p+ld->p; c omb->op_mask[0]='\0'; c omb->op_mask[1]='\0'; parent=creat_huffp(comb); if(h1! =NULL) insert_n(h1,comb); if(h1->next! =NULL) h1=del_min(h1,min2); parent->l_child=ld; parent->r_child=rd; c omb->huf_p=parent; head=parent; c out<<++i< if(h 1->next==NULL)break; } delete comb; return head; } f_min_p* fin_min(f_min_p* h) { f_m in_p *h1,*p1; h1=h; p1=h1; fl oat min=h1->p; h1=h1->next; wh ile(h1) { if(m in>(h1->p)) { min=h1->p; p1=h1; } h1=h1->next; } return p1; } f_min_p* del_min( f_min_p *h,f_min_p *p) { f_ min_p *p1,*p2; p1= h; p2= h; if(h==p) { h= h->next; delete p; } else { while(p1->next! =NULL) { p1= p1->next; if(p1==p) { p2-> next=p1->next; del ete p; break; } p2=p1; } } return h; } void insert_n(f_min_p *h,f_min_p *p1) { p1->next=h->next; h->next=p1; } huff_p* cr eat_huffp(f_min_p* d) { huf f_p* p1; p1= new huff_p; p1->l _child=NULL; p1->r_ child=NULL; p1-> p=d->p; p1->op_ mask[0]=d->op_mask[0]; p1->op_ mask[1]=d->op_mask[1]; return p1; } void r_find(huff_p* p1,char code[],int i,huff_code* h) { if(p1->l _child) { code[i]=' 1'; r_fi nd(p1->l_child,code,i+1,h); } if(p1->o p_mask[0]! ='\0') { huf f_code* p2=new huff_code; p2-> op_mask[0]=p1->op_mask[0]; p2-> op_mask[1]=p1->op_mask[1]; p1->op_ mask[2]='\0'; p2-> p=p1->p; for(int j=0;j { p2->c ode[j]=code[j]; } p2->code[j]='\0'; p2->next=h->next; h->next=p2; } if(p1->r_child) { code[i]='0'; r_find( p1->r_child,code,i+1,h); } del ete p1; } void creat_huffman_code(huff_p* h1,huff_code* h) { int i=0; char code[N]; r_fi nd(h1,code,i,h); } void output_huffman(huff_code* head) { h uff_code* h=head->next; cout<<"OP: "<<"-- 概率--"<<' '<<"--编码--"< cout<<"- --------------------------------"< while(h) { h->o p_mask[2]='\0'; cout<< h->op_mask<<": "< h=h-> next; } cout<<"------- --------------------------"< cout<< endl; } void cal_sort_length(huff_code* head) { huf f_code *h=head->next; double j=0; float one_length=0; float per_length=0; float ext_length=0;//按1-2-3-5 扩展编码的最小长度为。 while(h) { float length=0; int i=0; while(h->code[ i]! ='\0') { len gth++; i++; } one _length=h->p*length; per_l ength=per_length+one_length; h=h-> next; j++; } int i1=int(j); huff_code *p2=head->next; fl oat* p_a=new float[i1]; //sor t 指令概率 int i0=0; while(p 2) { p_a [i0++]=p2->p; p2= p2->next; } float max,temp; int l; for(int s=0;s { m ax=p_a[s]; l=s; for(int k=s+1;k { if (max { m ax=p_a[k];l=k; } } tem p=p_a[s]; p_a[s]=max; p_a [l]=temp; } // 计算1-2-3-5 扩展编码的最短平均长度 fl oat* code_len=new float[i1]; co de_len[0]=1; co de_len[1]=2; co de_len[2]=3; co de_len[3]=5; for(int i=4;i l=0; while(l { ext _length=ext_length+code_len[l]*p_a[l]; l++; } //计算等长编码平均长度; double q_length=log10(j)/log10 (2); cout<<" 此指令集操作码huffman 编码的平均长度为: "< cout<<" 等长编码的平均长度为: "< cout<<" 按1-2-3-5 的扩展编码的最短平均编码长度为: "< cout<< endl; cout<< endl; if(q_l ength>per_length) { cout<<" 可见HUFFMAN 编码的平均长度要比等长编码的平均长度短"< } else { co ut<<"huffman 编码有问题请仔细查看算法,以及输入的指令集的概率之和是否大 于1。 "< } if(ext _length>per_length) { cout<<" 可见HUFFMAN 编码的平均长度要比1-2-3-5 扩展编码的最短平均长度短 "< else { co ut<<"huffman 编码有问题请仔细查看算法,以及输入的指令集的概率之和是否大 于1。 "< } } 实验二 使用LRU算法更新Cache 一、实验目的 了解和掌握寄存器分配和内存分配的有关技术。 二、实验内容 程序1 结合数据结构的相关知识,使用 LRU 的策略,对一组访问序列进行内部的 Cache 更新
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机体系结构 实验 报告