四川大学微机原理冒泡法排序实验报告.docx

上传人:b****5 文档编号:28959822 上传时间:2023-07-20 格式:DOCX 页数:17 大小:134.53KB
下载 相关 举报
四川大学微机原理冒泡法排序实验报告.docx_第1页
第1页 / 共17页
四川大学微机原理冒泡法排序实验报告.docx_第2页
第2页 / 共17页
四川大学微机原理冒泡法排序实验报告.docx_第3页
第3页 / 共17页
四川大学微机原理冒泡法排序实验报告.docx_第4页
第4页 / 共17页
四川大学微机原理冒泡法排序实验报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

四川大学微机原理冒泡法排序实验报告.docx

《四川大学微机原理冒泡法排序实验报告.docx》由会员分享,可在线阅读,更多相关《四川大学微机原理冒泡法排序实验报告.docx(17页珍藏版)》请在冰豆网上搜索。

四川大学微机原理冒泡法排序实验报告.docx

四川大学微机原理冒泡法排序实验报告

 

《微机原理与接口技术实验报告》

 

学院:

电气信息学院

班级:

电力

老师:

学号:

姓名:

1.实验目的…………………………………………………………1

2.实验内容…………………………………………………………1

3.程序流程图………………………………………………………2

4.程序清单与注释…………………………………………………4

5.运行结果…………………………………………………………10

6.实验心得…………………………………………………………11

 

1、实验目的:

经过第一次试验,我们初次了解了DEBUG调试程序强大功能。

1.学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。

2.理解并掌握各种指令的功能,编写完整的汇编源程序。

3.进一步熟悉DEBUG的调试命令。

二、实验内容:

用冒泡的方法对一组数据元素排序,它的基本方法是:

将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。

对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。

每一遍的排序由若干次邻元素的排序组成。

4遍排序中,邻元素的排序依次为4,3,2,1遍。

完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。

外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DECCX)

排序遍数

本遍排序前

第一次排序后

第二次排序后

第三次排序后

第四次排序后

1

300,250,280,240,260

250,300,280,240,260

250,280,300,240,260

250,280,240,300,260

250,280,240,260,300

2

250,280,240,260,300

250,280,240,260,300

250,240,280,260,300

250,240,260,280,300

3

250,240,260,280,300

250,240,260,280,300

240,250,260,280,300

4

240,250,260,280,300

240,250,260,280,300

实验要求:

1.编制程序,从键盘输入300,250,280,240,260这五个数,并思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;

2.对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;

3.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;

4.去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;

5.用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);

6.用移位指令将平均值以二进制串的形式输出。

7.设计程序要有模块化的思想,用子程序实现不同的功能;

8.所有数据输出前要用字符串的输出指令,进行输出提示(如:

zuidazhishi:

300等),所有数据结果能清晰地显示在电脑屏幕上。

 

3、程序流程图:

开始

初始化

键盘输入数据

调用INPUT子程序

输入是否正确

显示原始数据

调用OUTPUT子程序

显示错误输入

显示冒泡排序后的数据

调用SORT子程序

显示平均值二进制串Binary

调用OUTPUT子程序

显示最小程序Min

显示最大值Max

显示其余数平均数值Average

调用ONE子程序

调用ONE子程序

调用ONE子程序

调用ONE子程序

结束

1.主程序MAIN:

 

 

2.冒泡排序子程序:

SORT

 

 

 

 

 

结束

 

4、程序清单与注释:

NAMEBUBBLE_SORT

DATASEGMENT

ARRAYDW5DUP()

COUNTDW5

TWODW2

FLAG1DW0

FLAG2DB0

FAULTDW-1

CRDB0DH,0AH,'$'

STR1DB'PleaseinputfivenumbersseperatedwithspaceandfinishedwithEnter:

','$'

STR2DB'Theoriginalnumbers:

','$'

STR3DB'Thesortednumbers:

','$'

STR4DB'TheMin:

','$'

STR5DB'TheMax:

','$'

STR6DB'TheAverage:

','$'

STR7DB'Thebinarysystemoftheaverage:

','$'

STR8DB'Inputerror!

Pleaseinputagain!

','$'

DATAENDS

CODESEGMENT

MAINPROCFAR

ASSUMECS:

CODE,DS:

DATA,ES:

DATA

START:

PUSHDS

ANDAX,0

PUSHAX

MOVAX,DATA

MOVDS,AX

LEADX,STR1

MOVAH,09H

INT21H

CALLCRLF

REIN:

CALLINPUT

CMPAX,FAULT

JEREIN

LEADX,STR2

MOVAH,09H

INT21H

CALLOUTPUT

CALLSORT

LEADX,STR3

MOVAH,09H

INT21H

CALLOUTPUT

ANDSI,0

ANDBX,0

MOVBX,ARRAY[SI]

LEADX,STR4

MOVAH,09H

INT21H

CALLONE

CALLCRLF

LEADX,STR5

MOVAH,09H

INT21H

MOVBX,ARRAY[SI+8]

CALLONE

CALLCRLF

LEADX,STR6

MOVAH,09H

INT21H

ANDDX,0

MOVAX,ARRAY[SI+2]

ADDAX,ARRAY[SI+4]

ADCAX,ARRAY[SI+6]

MOVCX,COUNT

DECCX

DECCX

DIVCX

MOVBX,AX

CALLONE

CALLCRLF

LEADX,STR6

MOVAH,09H

MOVCX,16

LL1:

ANDDX,0

DIVTWO

PUSHDX

LOOPLL1

MOVCX,16

LL2:

POPDX

ADDDL,30H

MOVAH,2

INT21H

LOOPLL2

MOVAH,4CH

INT21H

MAINENDP

 

CRLFPROC

LEADX,CR

MOVAH,09H

INT21H

RET

CRLFENDP

 

INPUTPROC

MOVCX,COUNT

ANDSI,0

NEXT1:

CALLDTB

DECCX

CMPDL,20H

JESTO

CMPDL,0DH

JEEXIT2

CALLCRLF

ERROR:

LEADX,STR8

MOVAH,09H

INT21H

CALLCRLF

MOVAX,FAULT

JMPEXIT3

STO:

MOVARRAY[SI],BX

ADDSI,2

JMPNEXT1

EXIT2:

MOVARRAY[SI],BX

CALLCRLF

EXIT3:

RET

INPUTENDP

 

DTBPROC

ANDBX,0

ANDFLAG1,0

CHAR:

MOVAH,01H

INT21H

MOVDL,AL

CMPAL,2DH

JNZNEXT2

MOVFLAG1,1

JMPCHAR

NEXT2:

SUBAL,30H

JLNEXT3

CMPAL,09H

JGNEXT3

CBW

XCHGAX,BX

MOVCX,10

MULCX

XCHGAX,BX

ADDBX,AX

JMPCHAR

NEXT3:

CMPFLAG1,1

JNZEXIT1

NEGBX

EXIT1:

RET

DTBENDP

 

OUTPUTPROC

CALLCRLF

MOVDI,COUNT

ANDSI,0

GO1:

MOVBX,ARRAY[SI]

TESTBX,8000H

JZGO2

MOVDL,2DH

MOVAH,02H

INT21H

NEGBX

GO2:

CALLONE

MOVDL,2DH

MOVAH,02H

INT21H

ADDSI,2

DECDI

JNZGO1

CALLCRLF

RET

OUTPUTENDP

 

ONEPROC

PUSHBX

PUSHCX

PUSHSI

PUSHDI

MOVCX,10000

CALLBTD

MOVCX,1000

CALLBTD

MOVCX,100

CALLBTD

MOVCX,10

CALLBTD

MOVCX,1

CALLBTD

ADDDL,FLAG2

CMPDL,30H

JNEQUIT3

MOVAH,02H

INT21H

QUIT3:

POPDI

POPSI

POPCX

POPBX

ANDFLAG2,0

RET

ONEENDP

 

BTDPROC

MOVAX,BX

ANDDX,0

DIVCX

MOVBX,DX

MOVDL,AL

ADDDL,30H

CMPFLAG2,0

JNEQUIT1

CMPDL,30H

JEQUIT2

MOVFLAG2,1

QUIT1:

MOVAH,02H

INT21H

QUIT2:

RET

BTDENDP

 

SORTPROC

CLD

MOVCX,COUNT

DECCX

LOO1:

MOVDI,CX

ANDSI,0

LOO2:

MOVAX,ARRAY[SI]

CMPAX,ARRAY[SI+2]

JLLOO3

XCHGAX,ARRAY[SI+2]

MOVARRAY[SI],AX

LOO3:

ADDSI,2

LOOPLOO2

MOVCX,DI

LOOPLOO1

RET

SORTENDP

 

CODEENDS

ENDSTART

 

五、运行结果:

1.对300、250、280、240、260五个数据进行冒泡排序,运行结果如下:

2、对5802、129、30、7、1233五个数据进行冒泡排序,运行结果如下:

3.对-1、23、189、-234、6五个数据进行冒泡排序,运行结果如下:

4.当输入不合法时,显示如下:

六、实验心得:

在本次汇编语言程序设计实验中,我们运用了循环结构对冒泡排序进行了汇编设计。

首先,编写了对给定数据进行冒泡排序的算法设计,以便熟悉冒泡排序的逻辑结构,理清设计思路。

本来,一直以为汇编语言和C语言是差不多的,但是经过初次汇编语言编程,才发现,要用汇编语言编出完整算法是一件很不简单的事情,某一个小小的疏漏都会导致一大堆错误出现。

比如;十六进制的输入时要在后面加上H;;甚至是,做除法,必须要将DX清零。

这些小错误,经过多次实践,终于记到了。

这个算法程序比较复杂,为了使程序更加简洁明了,我对其进行了模块化设计,利用“CALL”指令调用子程序,这样明显非常好用。

为了防止输入无用和输出时遗漏零,引用了首位符号标志来进行判定。

在这一阶段,我也遇到了很大的困难,例如在输入完数据回车后,程序显示输入错误,经过仔细排查后才发现,在2号DOS功能调用时,少写了“INT21H”;还有子程序结束时,没有写上“RET”;命名过程名时与关键字重复等等。

接下来我还对算法程序进行进一步优化。

为了实现数据对齐,我增加了CRLF子程序,方便实现回车换行功能。

为了在输入不合法时,进行错误提示我定义了出错标志等等。

在整个上机实验过程中,我对各条语句的含义都有了更深刻的理解,编写程序和独立解决问题的能力都有所加强。

与此同时,我还认识到自己有很多的不足,在以后的上机实验中,要多锻炼,对汇编语言编程进一步的掌握和学习。

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

当前位置:首页 > 高等教育 > 工学

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

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