冒泡排序(正向+逆向)-汇编语言课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1课程设计报告设计题目:汇编冒泡排序算法分析名称:微机原理与接口课程设计班级:信息工程学院通信0902姓名:杨旭学号:2009012325设计时间:2011-12-16至2011-12-25指导教师:徐明娟评语:评阅成绩:评阅教师:2一、课程设计的性质和目的:通过课程设计,进行程设计方法和技能的基本训练,巩固在课堂上学到的有关软件程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。二、课程设计的要求:1、遵循模块化、结构化的程序设计方法。2、要求程序必须正确。3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。4、要求程序结构合理,语句使用得当。5、适当追求编程技巧和程序运行效率。三、主要仪器设备及软件:PC机、MASM汇编软件。四、课程设计题目及要求:题目:汇编冒泡排序算法分析要求:用汇编语言编写冒泡排序的算法,并比较冒泡排序正向和逆向排序的算法的优缺点和适用情况。3五、课题分析及设计思路:冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。冒泡排序可分为正向和逆向两种排序.通过主程序对子程序的调用来完成输入输出,排序,循环,转化等功能。4六、程序主要流程图:NN外循环计数器DX-1DX=0结束开始初始化I=0地址加2数i=数i+1二数交换位置内循环计数器CX-1CX=05七、程序主要代码与分析(关键代码要有注释):BUF为首址的字符区存放10个无符号数,从大到小进行排序(逆向)datasegmentbufdw3,-4,6,7,9,2,-8,-10,20,0dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovcx,10deccxlop1:movdx,cxmovbx,0lop2:movax,buf[bx]cmpax,buf[bx+2]jgelop3xchgax,buf[bx+2]movbuf[bx],ax6lop3:addbx,2deccxjnelop2movcx,dxlooplop1movah,4chint21hcodeendsendstart逆向排序程序截图:将4,6,7,9,2,0,3,8,10,20按降序排序第一轮:467920381020647920381020647920381020649720381020649720381020不交换交换交换交换7649720381020649723081020649723801020649723810020第二轮:649723810200694723810200697423810200697423810200、697432810200697438210200交换不交换交换交换交换交换交换不交换交换交换交换8697438102200697438102020如此下去最终排序为:20,10,9,8,7,6,4,3,2,0冒泡正向排序:datasegmentnumdw50dup(?)countdw10flag1db0;符号标志flag2db0;首位0标志mess1db'***Pleaseinputtenintegers(-32768---32767)***',13,10db'***seperatethemwithcommaandendinputwithEnter:***$'mess2db'***Inputerror!Pleaseinputagain!***$'mess3db'***Thesourcenumbersareasfollows:***$'mess4db'***Thesortednumbersareasfollows:***$'dataendsprognamsegmentmainprocfarassumecs:prognam,ds:datastart:pushds;把原数据存放到段寄存器subax,axpushaxmovax,datareamovds,ax交换不交换9redo:callinput;输入原始数据cmpax,-1d;判断是否出错jeredo;出错,退出leadx,mess3movah,09;9号调用,显示字符串,请求输出数据int21hcalloutput;输出原始数据callbubblesort;对原始数据进行冒泡排序leadx,mess4movah,09;9号调用,显示字符串,请求输出数据int21hcalloutput;输出排序后的数据movah,4chint21hmainendpinputproc;输入原始数据leadx,mess1movah,09int21h;9号调用,显示字符串,请求输入数据callcrlf;回车,换行movsi,0movcx,countenter:calldecibindeccxcmpdl,',';进行分隔符判断,以逗号为分隔符jestorecmpdl,13;进行换行判断jeexit2jneerrorstore:movnum[si],bx;将BX中的二进制数存储到num中addsi,2jmpentererror:callcrlf;输出报错信息leadx,mess2movah,09;9号调用,显示字符串,输入数据10int21hcallcrlfmovax,-1d;以AX中的值作为出错标志jmpexit3exit2:movnum[si],bx;将BX中内容存入以num为首的存储单元中callcrlf;回车换行exit3:retinputendpbubblesortproc;将num[]中存储的数进行冒泡排序movcx,count;初始化计数器CXdeccxlg1:movdi,cx;保存CX的值movsi,0lg2:movax,num[si];相邻的两数进行比较大小cmpax,num[si+2]jlelg3xchgax,num[si+2];进行数据交换movnum[si],axlg3:addsi,2looplg2;判断CX==0,循环movcx,di;还原CX的值looplg1;判断CX==0,循环retbubblesortendpoutputproc;将num[]里的数据以十进制输出在屏幕上callcrlf;回车,换行movsi,0movdi,countnext1:movbx,num[si]testbx,8000h;判断正负jznext4movdl,'-'movah,2;2号调用,显示单字符负号'-'int21hnegbx;求补11next4:callbinidec;将BX中的二进制数用十进制在屏幕上输出movdl,','movah,02;2号调用,输出分隔符','int21haddsi,2decdijnznext1callcrlfretoutputendpdecibinproc;从键盘中取得十进制数转化为二进制,并存入BX中movbx,0movflag1,0;符号位标志flag1,0为正数,1为负数newchar:movah,1;1号调用,单字符输入,送入alint21hmovdl,alcmpal,2dh;与符号减号'-'的ASCII码作比较jnznext2movflag1,1jmpnewcharnext2:subal,30hjlnext3cmpal,9djgnext3cbwxchgax,bxmovcx,10dmulcxxchgax,bxaddbx,ax;数据加rjmpnewcharnext3:cmpflag1,1jneexit1negbx;对bx中的内容进行求补exit1:ret12decibinendpbinidecproc;将BX中的二进制数以十进制形式输出在屏幕上pushbxpushcxpushsipushdimovcx,10000dcalldec_divmovcx,1000dcalldec_divmovcx,100dcalldec_divmovcx,10dcalldec_divmovcx,1dcalldec_divadddl,flag2cmpdl,30h;判断这个数是否是0,以免没有输出0jnelg6movah,02hint21hlg6:popdipopsipopcxpopbxmovflag2,0;还原0标志retbinidecendpdec_divproc;将BX中的需转换的十进制数,输出在屏幕上movax,bxmovdx,0divcxmovbx,dxmovdl,aladddl,30h;转换成ASCII码13cmpflag2,0jnelg4cmpdl,30h;判断十进制数是否为0,以判断是否输出jelg5movflag2,1lg4:movah,02h;2号调用,输出十进制数int21hlg5:retdec_divendpcrlfproc;向终端发出回车、换行符,完成一次回车换行操作movdl,0ahmovah,02h;显示功能int21hmovdl,0dh;回车movah,02h;显示功能int21hretcrlfendpprognamendsendstart正向排序程序截图:1、正确输出结果:142、当输入不合法时,程序会自动跳到初始位置,并给出了出错提醒,要求重新输入数据:3、当输入不足10个数时,就会自动补0:15九、心得体会:经过九天左右的汇编语言课程设计,使我对汇编语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在汇编语言认识上还不足,通过学习也有所改进;还有对汇编语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。汇编语言比高级语言更加底层,要求用户能够了解每一个细节性的东西。汇编程序采用指令助记符来完成一个又一个操作,程序十分简短,但功能却很强大。这次的冒泡排序程序设计中,我不仅复习了冒泡算法,还复习了汇编程序中子程序的使用。就设计结构而言,本次课设还是采用功能分解、逐步求精的思想,一步步的实现要求的功能,并在一些已有的程序上作进一步的改进,来达到要求实现的的功能。就这两点而言,这和高级语言C++很像,实现起来的过程也十分相似。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功