汇编语言报告正文.docx

上传人:b****1 文档编号:2420117 上传时间:2022-10-29 格式:DOCX 页数:21 大小:248.07KB
下载 相关 举报
汇编语言报告正文.docx_第1页
第1页 / 共21页
汇编语言报告正文.docx_第2页
第2页 / 共21页
汇编语言报告正文.docx_第3页
第3页 / 共21页
汇编语言报告正文.docx_第4页
第4页 / 共21页
汇编语言报告正文.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

汇编语言报告正文.docx

《汇编语言报告正文.docx》由会员分享,可在线阅读,更多相关《汇编语言报告正文.docx(21页珍藏版)》请在冰豆网上搜索。

汇编语言报告正文.docx

汇编语言报告正文

一、软件背景介绍

汇编语言是我们理解整个计算机系统的最佳起点和最有效途径。

汇编语言是机器指令的助记表示,描述了机器最终要执行的指令序列,是人与机器最直接的沟通语言。

目前在许多高校的计算机系中数据结构是学生学习的必修课,而哈夫曼树是其重要学习内容。

此软件的设计,其目的就是让学生了解汇编语言的强大和对数据结构中学的哈夫曼树及求哈夫曼树WPL的知识能更好地直观地了解并掌握。

软件的功能就是对给定的叶子节点及权值进行构造哈夫曼树,在构造中,软件会一步一步地演示怎样构造哈夫曼树,构造完后显示构造好的哈夫曼树,然后计算WPL,并且把计算的式子显示出来。

软件的功能如下图所示。

软件刚打开时的界面如图1所示:

图1软件开始界面

软件完成哈夫曼树的构造如图2所示:

图2完成哈夫曼树的构造

计算WPL如图3所示:

图3计算WPL

二、核心算法思想

求哈夫曼树WPL的大体算法是:

给出叶子节点数目及权值,然后构造哈夫曼树,最后求WPL。

核心算法思想:

1、构建哈夫曼树

哈夫曼树(Huffman树)是带权路径长度最小的二叉树。

根据哈夫曼树的定义,一棵二叉树要使其带权路径长度最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

哈夫曼依据这一特点提出了哈夫曼算法,其基本思想是:

  ⑴初始化:

由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={T1,T2,…,Tn};

  ⑵选取与合并:

在F中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一棵新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点权值之和;

  ⑶删除与加入:

在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中;

⑷重复⑵、⑶两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是哈夫曼树。

2、计算WPL

树的带权路径长度(WeightedPathLengthofTree,简记为WPL)。

  结点的权:

在一些应用中,赋予树中结点的一个有某种意义的实数。

  结点的带权路径长度:

结点到树根之间的路径长度与该结点上权的乘积。

  树的带权路径长度(WeightedPathLengthofTree):

定义为树中所有叶结点的带权路径长度之和,通常记为:

其中:

n表示叶子结点的数目

wi和li分别表示叶结点ki的权值和根到结点ki之间的路径长度。

树的带权路径长度亦称为树的代价。

根据计算WPL。

三、核心算法流程图

根据求哈夫曼树WPL的核心算法思想,就可以画出核心算法流程图。

核心算法流程图分为两部分,第一部分是根据叶子节点数和其权值构造哈夫曼树,第二部分是根据构建好的哈夫曼树计算其WPL。

核心算法流程图如下所示:

1、构建哈夫曼树的流程图,如图4所示:

 

图4构建哈夫曼树的流程图

2、计算WPL如图5所示:

 

图5计算WPL

以上就是核心算法的流程图。

流程图的好坏直接影响编码的思路,所以画流程图很重要。

流程图画好以后,就可以根据流程图有条理地进行编码了。

四、源代码

下面给出的是求哈夫曼树WPL算法实现的程序的源代码:

ASSUMEcs:

CODE,ds:

DATA,ss:

STACK

DATASEGMENT

TREENODESdw3*256dup(0);存放数的节点(节点最多为255,且前三个字空间没有用到),每个节点占3个字0:

权值1:

左孩子位置2:

右孩子位置,位置为0代表位置空

ROOTNODEdw0;树根地址

NODETOPdw0;存储当前树节点个数

LEAFNUMdw0;存放叶子节点的数目

WSTACKdw256dup(0);字型型栈空间

LEAFNODESdd6,7,8,5,9;存储生成哈夫曼树叶子节点的权值,叶子节点的数量最大为128

DATAENDS

STACKSEGMENT;声明堆栈

dw256dup(0);栈最大放256个元素

STACKENDS

CODESEGMENT;代码段

START:

movax,DATA;将存储地址为DATA的数移送到通用寄存器ax中

movds,ax

movax,STACK;将存储地址为STACK的数移送到通用寄存器ax中

movss,ax

movsp,256;堆栈栈顶最大偏移为256

movsi,offsetLEAFNODES;指向生成的哈夫曼树的存储位置

movdi,offsetTREENODES;指向叶子节点权值的存放位置(注:

每个叶子节点的权值占用两个字节)

movcx,5;叶子节点的个数

callHFTREEINIT;由给定的叶子节点的权值生成哈夫曼树

movdi,offsetTREENODES;指向指向哈夫曼树的存储位置

callGETTREELEN;计算哈夫曼树的加权通路长度,结果放入ax中

movax,4c00h

int21H

;由给定的叶子节点生成一颗哈夫曼树

;参数说明:

;ds:

di指向哈夫曼树的存储位置

;ds:

si执向生成哈夫曼树叶子节点的起始位置

;(cx)=叶子节点的个数

HFTREEINIT:

pushax;将ax中的数压栈

pushbx

pushcx;将cx中的数压栈

pushdx

movLEAFNUM,cx;叶子节点数移到cx

cmpLEAFNUM,0;叶子节点数与0比较

jehfret;跳转到hfret

hfA:

callGETTWOMIN;调用GETTWOMIN

cmpLEAFNUM,1;叶子节点数与1比较

jehfret;大的话转到hfret

jmphfA;否则转到hfA

hfret:

movax,NODETOP;节点个数

movROOTNODE,ax;确定根节点的位置

popdx

popcx

popbx;基址寄存器地址压栈

popax

ret;修改栈中的数据

;查找权值中的最小值和次小值并生成树的节点

GETTWOMIN:

pushax

pushbx

pushcx;计数器中的数压栈

pushdx

pushdi

pushds

pushsi

jmpgestart;跳转到gestart

firstdw0;存储最小值

firstpodw0;存储最小值位置

seconddw0;存储次小值

secondpodw0;存储次小值位置

lchilddw0;左孩子位置

rchilddw0;右孩子位置

gestart:

cmpLEAFNUM,0

jejmpA;跳转到jmpA

jmpjmpB

jmpA:

jmptoretA;从jmpA跳转到toretA

jmpB:

movax,LEAFNUM;叶子节点数如ax

cmpax,1

jejmpC;跳转到jmpC

jmpjmpD

jmpC:

jmptoretB;从jmpC跳转到toretB

jmpD:

movax,ds:

[si]

movfirst,ax;最小值first到ax

movfirstpo,si;最小值的位置到si

movcx,LEAFNUM

deccx;循环次数

pushsi

pushsi

getA:

jcxzgetG;跳转到getG

addsi,4;si与4相加,结果放在si中

movax,ds:

[si]

cmpax,first;最小值与ax中的值比较

jnbtogetA;转到togetA

movfirst,ax

movfirstpo,si;最小值的位置移到si

togetA:

loopgetA;循环执行getA

getG:

movbx,firstpo

movax,ds:

[bx+2];得到当前叶子节点在树的存储位置,0代表还没有生成节点

cmpax,0

jecrenodeA

movwordptrlchild,ax;记录左孩子位置

jmpgetE

crenodeA:

incNODETOP;生成一个节点

movax,NODETOP

movlchild,ax;记录左孩子位置(作为父结点的左孩子)

moval,6

movbx,NODETOP;最大支持255个节点

movbh,0

mulbl

movbx,ax;ax中的数移到bx中

movax,first

movds:

[bx+di],ax;记录权值

movwordptrds:

[bx+di+2],0;左孩子位置0

movwordptrds:

[bx+di+4],0;右孩子位置0

getE:

popsi

movcx,LEAFNUM;叶子节点数移到cx中

deccx

movax,ds:

[si]

movsecond,ax;次小值移到ax中

movsecondpo,si;次小值的位置到si

cmpsi,firstpo

jnegetB;跳转到getB

addsi,4

deccx

movax,ds:

[si];叶子节点的位置到ax

movsecond,ax

movsecondpo,si;次小值的位置到si

getB:

jcxzgetF;跳转到getF

addsi,4

movax,ds:

[si]

cmpsi,firstpo;比较si与最小值位置的大小

jetogetB;大的话转到togetB

cmpax,second

jnbtogetB

movsecondpo,si;重新给si赋给次小值的位置

movsecond,ax

togetB:

loopgetB;循环执行getB

getF:

movbx,secondpo

movax,ds:

[bx+2];得到当前叶子节点在树的存储位置,0代表还没有生成节点

cmpax,0

jecrenodeB

movwordptrrchild,ax;记录左孩子位置

jmpgetC

crenodeB:

incNODETOP;生成一个节点

movax,NODETOP

movrchild,ax;记录右孩子位置(作为父结点的右孩子)

moval,6

movbx,NODETOP;最大支持255个节点

movbh,0

mulbl;bl自乘

mov

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1