微机原理实验报告-冒泡排序_第1页
微机原理实验报告-冒泡排序_第2页
微机原理实验报告-冒泡排序_第3页
微机原理实验报告-冒泡排序_第4页
微机原理实验报告-冒泡排序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

。一、实验目的1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。2)理解并掌握各种指令的功能,编写完整的汇编源程序。3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。二、实验内容及要求1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。2)实验要求:①编制程序,对这组数进行排序并输出原数据及排序后的数据;②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化;③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值;④用压栈PUSH和出栈POP指令,将平均值按位逐个输出;⑤将平均值转化为二进制串,并将这组二进制串输出;⑥所有数据输出前要用字符串的输出指令进行输出提示, 所有数据结果能清晰显示。三、程序流程图(1)主程序:MAIN 开始初始化键盘输入数据调用INPUT 子程序 显示输入错误否输入是否正确是显示原始数据调用OUTPUT 子程序精选资料,欢迎下载。显示冒泡排序后的数据调用SORT子程序调用OUTPUT 子程序显示最小值 Min显示One子程序显示最大值 Max调用One子程序显示其余数平均值 Average调用One子程序显示平均值二进制串 Binary调用One子程序结束精选资料,欢迎下载。(2)冒泡排序子程序 :SORTCOUNT1----外循环次数COUNT2----内循环次数i ----数组下标否否

进入初始化COUNT1=N-1COUNT2=COUNT1SI=0否Ai≥Ai+1是Ai与Ai+1两数交换SI=SI+2COUNT2=COUNT2-1COUNT2=0 ?是COUNT1=COUNT1-1COUNT2=0 ?是返回精选资料,欢迎下载。四、程序清单NAMEBUBBLE_SORTDATASEGMENTARRAYDW5DUP(?);输入数据的存储单元COUNTDW5TWODW2FLAG1DW0;判断符号标志FLAG2DB0;判断首位是否为零的标志FAULTDW-1;判断出错标志CRDB0DH,0AH,'$'STR1DB'PleaseinputfivenumbersseperatedwithspaceandfinishedwithEnter:','$'STR2DB'Theoriginalnumbers:','$'STR3DB'Thesortednumbers:','$'STR4DB'TheMin:','$'STR5DB'TheMax:','$'STR6DB'TheAverage:','$'STR7DB'Thebinarysystemoftheaverage:','$'STR8DB'Inputerror!Pleaseinputagain!''$'DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,ES:DATASTART:PUSHDSANDAX,0PUSHAXMOVAX,DATAMOVDS,AXLEADX,STR1MOVAH,09H;9号DOS功能调用,提示输入数据INT21HCALLCRLF;回车换行REIN:CALLINPUT;调用INPUT子程序,输入原始数据CMPAX,FAULT;判断是否出错,JEREIN;出错则重新输入LEADX,STR2MOVAH,09H;9号DOS功能调用,提示输出原始数据INT21HCALLOUTPUT;调用OUTPUT子程序,输出原始数据CALLSORT;调用SORT子程序,进行冒泡排序LEADX,STR3MOVAH,09H;9号DOS功能调用,提示输出排序后的数据INT21H精选资料,欢迎下载。CALLOUTPUT;调用OUTPUT子程序,输出排序后的数据ANDSI,0ANDBX,0MOVBX,ARRAY[SI];将最小值存入BXLEADX,STR4MOVAH,09H;9号DOS功能调用,提示输出数据的最小值INT21HCALLONE;调用ONE子程序,输出最小值CALLCRLFLEADX,STR5MOVAH,09H;9号DOS功能调用,提示输出排序后的最大值INT21HMOVBX,ARRAY[SI+8];将最大值存入BXCALLONE;调用ONE子程序,输出最大值CALLCRLFLEADX,STR6MOVAH,09H;9号DOS功能调用,提示输出平均值INT21HANDDX,0MOVAX,ARRAY[SI+2];将去掉最大最小值的其余各数之和存入AXADDAX,ARRAY[SI+4]ADCAX,ARRAY[SI+6]MOVCX,COUNT;计数器CX=5DECCX;CX←CX-1DECCXDIVCX;字除法,余数存入AXMOVBX,AX;将余下各数的平均值存入BXCALLONE;调用ONE子程序,输出去掉最大最小值的其余数平均值CALLCRLFLEADX,STR6MOVAH,09H;9号DOS功能调用,提示输出平均值的二进制串MOVCX,16;16位二进制串,计数器初始值为16LL1:ANDDX,0DIVTWOPUSHDXLOOPLL1MOVCX,16LL2:POPDXADDDL,30H;将DL中的数进行ASCII码转换MOVAH,2;2号DOS功能调用,输出字符“0”或“1”INT21HLOOPLL2MOVAH,4CHINT21H;4C号功能调用,返回DOS精选资料,欢迎下载。MAIN ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:CRLF功能: 回车和换行;--------------------------------------------------------------------------------------------------------------------------------CRLF PROCLEA DX,CRMOV AH,09HINT 21HRETCRLF ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:INPUT功能: 输入一组数据;--------------------------------------------------------------------------------------------------------------------------------INPUT PROCMOV CX,COUNT ; 计数器CX=5AND SI,0NEXT1:CALLDTB ; 调用DTB子程序,将输入转换为二进制数DEC CX ;CX ←CX-1CMP DL,20H ; 判断输入字符是否为空格符JE STOCMP DL,0DH ; 判断输入字符是否为换行符JE EXIT2CALLCRLFERROR:LEA DX,STR8MOV AH,09H ;9 号DOS功能调用,提示输入不合法INT 21HCALLCRLFMOV AX,FAULT ; 以AX中的值作为出错标志JMP EXIT3STO: MOV ARRAY[SI],BX ; 是空格符,将 BX中的二进制数存入存储单元ADD SI,2JMP NEXT1EXIT2:MOV ARRAY[SI],BX ; 是换行符,将 BX中的二进制数存入存储单元CALLCRLFEXIT3:RETINPUT ENDP;--------------------------------------------------------------------------------------------------------------------------------精选资料,欢迎下载。子程序:DTB功能:将键盘输入的十进制数转换为二进制数形式存入BX;--------------------------------------------------------------------------------------------------------------------------------DTBPROCANDBX,0ANDFLAG1,0;符号标志,0为正,1为负CHAR:MOVAH,01H;1号DOS功能调用,输入一个字符,存入ALINT21HMOVDL,ALCMPAL,2DH;判断输入字符是否为负号"-"JNZNEXT2MOVFLAG1,1;是负数,将符号标志FLAG1置1JMPCHARNEXT2:SUBAL,30H;判断输入字符是否在0-9之间JLNEXT3CMPAL,09HJGNEXT3CBWXCHGAX,BX;输入字符在0-9之间,将BX中的数乘以10MOVCX,10MULCXXCHGAX,BXADDBX,AX;将BX中的数与新输入的数相加JMPCHARNEXT3:CMPFLAG1,1;根据符号标志判断输入是否为负JNZEXIT1NEGBX;对BX中的数求补EXIT1:RETDTB ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:OUTPUT功能: 输出一组数据;--------------------------------------------------------------------------------------------------------------------------------OUTPUTPROCCALLCRLFMOV DI,COUNT ; 计数器DI=5AND SI,0GO1: MOV BX,ARRAY[SI] ; 将存储单元的第一组数据存入 BXTESTBX,8000H ; 判断正负JZ GO2MOV DL,2DH精选资料,欢迎下载。MOVAH,02H;2号DOS功能调用,输出负号"-"INT21HNEGBXGO2:CALLONE;调用ONE子程序,将BX中二进制数转换为十进制数输出MOVDL,20HMOVAH,02H;2号DOS功能调用,输出空格符INT21HADDSI,2;指针指向下一数据DECDI;DI←DI-1JNZGO1;计数器DI不为零,继续循环CALLCRLFRETOUTPUTENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:ONE功能: 将BX中的的二进制数转换为十进制数 ,由高到低各位依次输出;--------------------------------------------------------------------------------------------------------------------------------ONEPROCPUSHBXPUSHCXPUSHSIPUSHDIMOVCX,10000;除数存入CXCALLBTDMOVCX,1000CALLBTDMOVCX,100CALLBTDMOVCX,10CALLBTDMOVCX,1CALLBTDADDDL,FLAG2CMPDL,30H;与"0"的ASCII码比较,判断该数是否为"0"JNEQUIT3MOVAH,02H;2号DOS功能调用,输出"0"INT21HQUIT3:POPDIPOPSIPOPCXPOPBXANDFLAG2,0;将首位标志FLAG2重新置0精选资料,欢迎下载。RETONE ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:BTD功能: 将BX中的二进制数转换为一个十进制数输出--------------------------------------------------BTDPROCMOVAX,BXANDDX,0DIVCX;字除法,商值存入AX,余数存入DXMOVBX,DX;余数存入BXMOVDL,ALADDDL,30H;对DL中的数进行ASCII码转换CMPFLAG2,0;判断是否为首位数据JNEQUIT1CMPDL,30H;是首位则判断是否为"0"JEQUIT2;是"0"则不输出MOVFLAG2,1;不是"0"将首位标志置1QUIT1:MOVAH,02H;2号DOS功能调用,输出一位十进制数INT21HQUIT2:RETBTDENDP--------------------------------------------------子程序:SORT功能: 冒泡排序;--------------------------------------------------------------------------------------------------------------------------------SORT PROCCLDMOV CX,COUNT ; 初始化计数器 CXDEC CX ;CX=4LOO1: MOV DI,CX ;CX 中的数存入 DIAND SI,0LOO2: MOV AX,ARRAY[SI]CMP AX,ARRAY[SI+2] ; 相邻两数进行比较JL LOO3XCHGAX,ARRAY[SI+2] ; 前一数较大则进行数据交换MOV ARRAY[SI],AXLOO3: ADD SI,2 ; 前一数较小,则进行下一组比较LOOPLOO2 ;CX=0, 停止内循环MOV CX,DI ; 还原计数器 CX的值精选资料,欢迎下载。LOOPLOO1 ;CX=0, 停止外循环RETSORT ENDP;--------------------------------------------------------------------------------------------------------------------------------CODE ENDSEND START五、运行结果1)对300,250,280,240,260五个数进行冒泡排序,运行结果如下:(2)对-1,2,54 ,-38,43 五个数进行冒泡排序,运行结果如下精选资料,欢迎下载。(1)当输入不合法时,出现错误提示:(4)当输入数据不足 5个时程序自动补 0:六、心得体会在本次汇编语言程序设计实验中, 我们学习了汇编语言的循环结构, 并对冒泡排序法进行精选资料,欢迎下载。了汇编程序设计,我首先编写了对给定数据进行冒泡排序的算法设计, 这有助于我熟悉冒泡排序的逻辑结构,理清设计思路。汇编语言与 C语言相似,然而,在设计过程中,我才意识到,要用汇编语言写出完整的算法程序并不是一件简单的事, 一个微小的错误就可能导致整个程序无法正常运行。在编程时,出现了各种各样的错误, 如写程序时没有切换成英式标点,16进制数未加“H”符号,做字除法运算时忘记将DX清零而导致“DivideOverflow”。这些错误都在汇编调试过程中得到改正。在接下来的上机课程中,我们按照老师的要求对改程序进行了进一步设计——对从键盘输入的数据进行冒泡排序。这个算法程序较为复杂,为了使程序能够更加简洁明

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论