还剩39页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
一、实验目得1学习汇编语言循环结构语句得特点,重点掌握冒泡排序得方法2理解并掌握各种指令得功能,编写完整得汇编源程序3进一步熟悉DEBUG得调试命令,运用DEBUG进行调试汇编语言程序
二、实验内容及要求1实验内容从键盘输入五个有符号数,用冒泡排序法将其按从小到大得顺序排序2实验要求
①编制程序,对这组数进行排序并输出原数据及排序后得数据;
②利用DEBUG调试工具,用DO命令,查看排序前后内存数据得变化;
③去掉最大值和最小值,求出其余值得平均值,输出最大值、最小值和平均值;
④用压栈PUSH和出栈POP指令,将平均值按位逐个输出;
⑤将平均值转化为二进制串,并将这组二进制串输出;
⑥所有数据输出前要用字符串得输出指令进行输出提示,所有数据结果能清晰显示
三、程序流程图[开始]1主程序MAINLEA DX,STR4;9号DOS功能调用,提示输出MOV AH,09H数据得最小值INT21H;调用ONE子程序,输出最小CALL ONE值CALL CRLFLEA DX,ST R5;9号DOS功能调用,提示输出MOV AH,O9H排序后得最大值INT21H;将最大值存入B XMOV BX,ARRAY[SI+8];调用ON E子程序,输出最CALL ONE大值CALL CRLFLEA DX,STR6平均值AN DDX,0MOV AX,ARRAY[SI+2];将去掉最大最小值得其余各数之ADD AX,ARRA Y[SI+4]ADC AX,ARRAY[S I+6]MOV CX,COUNT;计数器CX=5DEC CX;CXyCX-1DEC CX;字除法,余数存入AXD IVCX;将余下各数得平均值存入BXMOV BX,AX;调用ONE子程序,输出去掉CALL ONE最大最小值得其余数平均值CA LLCRLF和存入AX出平均值得二进制串MOV CX,16;16位二进制串,计数器初始值为L L1:AND DX,0DIV TWOPUSH DXLOOP LL1MOV CX,16LL2:POP DXADD DL,30H换;将DL中得数进行ASC II码转MO VAH,2;2号DOS功能调用,输出字符“0”或“1”I NT21HLOOP LL2MOV AH,4CH;4c号功能调用,返回DOSI NT21H子程序CRLF功能回车和换行CRLF PROCLEA DX,CRMOV AH,09HI NT21HRETCRLF ENDP子程序INPUT功能输入一组数据INPUT PROCMOV CX,COUNT;计数器CX=5AND SI,0;调用DTB子程序,将输入转换NE XT1:CA LLDTB为二进制数;CX—CX7DEC CX;判断输入字符就就是否为空CMP DL,2OH格符JE STOCMP DL,0D H;判断输入字符就就是否为换行符JE EXIT2CA LLCRLFERROR:LEA DX,S TR8MOV AH,O9H;9号DOS功能调用,提示输入不合CALL CRLFMOV AX,F AULT;以AX中得值作为出错标志JMP EXI T3STO:MOV ARRAY[S l],BX;就就是空格符,将BX中得二进制数存入存储单元ADD S1,2JMP NEXT1EXIT2MOV;就就是换行符,将BX中得二进制数存入存储单元CALL CRLFEXITS:RETINPUT ENDP子程序DTB功能将键盘输入得十进制数转换为二进制数形式存入BXDTB PROCAND BX,0AND FLAG1,0;符号标志,0为正,1为负CHARMOV AH,01H;1号DOS功能调用,输入一个字符,存入ALINTMOV DL,ALCMP AL,2DH;判断输入字符就就是否为负号JNZ NEXT2MOV FLAG1J;就就是负数,将符号标志FL AG1JMP CHARNE XT2SUB AL,30H;判断输入字符就就是否在0-9之间JL NEXT3CMP AL,09HJG NEXT3XCHG AX,BX;输入字符在0-9之间,将BX中得数乘以10CBWMOV CX,10MUL CXBX,AX;将8乂中得数与新输入得数相XCHG AX,BXNEXT3:FLAG1,1;根据符号标志判断输入就就是否JMP CHARJNZ EXI T1通中得数求补EXI T1:RETDTB ENDP子程序OUTPUT功能输出一组数据OUTPUT PROCCALL CRLFMOV DI,COUNT;计数器DI=5AND SI,0GO1MOV BX,ARRAY[SI];将存储单元得第一组数据存入BXTEST BX,8OOOH;判断正负JZ G02MOV DL,2DHMOV AH,02H;2号DOS功能调用,4俞出负号”III NT21HNEG BXG02CALL ONE;调用ONE子程序,将BX中二进制数转换为十进制数输出MOV DL,20H;2号DOS功能调用,输出空格符MOV AH,02HI NT21H;指针指向下一数据ADD SI,2;D I4-D H1DEC D I;计数器DI不为零,继续循环JNZ G01CALL CRLFRETOUTP UTENDP子程序ONE功能将BX中得得二进制数转换为十进制数,由高到低各位依次输出初始化键盘输入数据就就是显示原始数据调用OUTPUT子程序PUSH BXPUSHCXPUSH SIPUSH DIMOV CX,10000;除数存入CXCALL BTDMOV CX,1OOOCALL BTDMOV CX,100CALL BTDMOVCX,10C ALLBTDMOVCX,1CALL BTDADD DL,FLAG2CMP DL,30H;与“0”得ASCII码比较,判断该数就就是否为“0”JNE QUIT3MOV AH,O2H;2号DOS功能调用,输出0I NT21HQUITS:POP DIPOPSIPOP CXPOPBXAND FLAG2,0;将首位标志FLAG2重新置0RETONE ENDP子程序BTD功能将BX中得二进制数转换为一个十进制数输出BTD PROCMOVAX,BXAND DX,0;字除法,商值存入AX,余数存入DDIV CXX;余数存入BXMOV BX,DXMOV DL,AL;对DL中得数进行ASC IADDDL,3OHI码转换;判断就就是否为首位数据CMP FLAG2,0JNE QUIT1;就就是首位则判断就就是CMP DL,30H否为“0HJE QUIT2MOV FLAG2,1;不就就是“0”将首位标志置1QUIT1:MOV AH,02H;2号DOS功能调用,输出一位十进制数I NT21HQU IT2:RETBTD ENDP子程序SORT功能冒泡排序SORT PROCOLDMOVCX,COUNT;初始化计数器CXDEC CX;CX=4MOV Dl,CX;CX中得数存入D IAND SI,0LO02MOVAX,ARRAY[SI]CMP AX,ARRAY[SI+2];相邻两数进行比较LOO3XC HGAX,ARRAY[SI+2];前一数较大则进行数据交换MOV ARRAY[S门,AXL003:ADD SI,2;前一数较小,则进行下一组比LOOP L002;CX=0,停止内循环MOVCX,DI;还原计数器CX得值LOOP L001;0*二0,停止外循环RETSORT ENDPCODEENDSEND START
五、运行结果⑴对300,250,280,240,260五个数进行冒泡排序,运行结果如下:®G:\MASM\DEBUG2-
1.EXE-n
1530.exe-1g一Please inputfive numbersseperated withspace and finished withEnter:300250280240260The originalnumbers:300250280240260The sorted numbers:240250260280300The Min:240The Max:300The Average:263Program terminatednormally⑵对7,2,54,-38,43五个数进行冒泡排序,运行结果如下G:\MASM\DEBUG2-
1.EXE-n
1530.exe-1Please inputfive numbersseperated withspace andfinished withEnter:-125413843The originalnumbers:-1254-3843The sortednumbers:-38-124354The Min:65498The Max:54The Average:15Program terminatednormally1当输入不合法时,出现错误提示:圈G:\MASM\DEBUG2-
1.EXE-n
1530.exe-1一gPlease inputfive numbersseparated withspace andfinished withEnter:124\Input errorPlease input again,4当输入数据不足5个时程序自动补0:
六、心得体会在本次汇编语言程序设计实验中,我们学习了汇编语言得循环结构,并对冒泡排序法进行了汇编程序设计,我首先编写了对给定数据进行冒泡排序得算法设计,这有助于我熟悉冒泡排序得逻辑结构,理清设计思路汇编语言与C语言相似,然而,在设计过程中,我才意识到,要用汇编语言写出完整得算法程序并不就就是一件简单得事,一个微小得错误就可能导致整个程序无法正常运行在编程时,出现了各种各样得错误,如写程序时没有切换成英式标点,16进制数未加符号,做字除法运算时忘记将DX清零而导致“D iv ide Overflowv这些错o误都在汇编调试过程中得到改正在接下来得上机课程中,我们按照老师得要求对改程序进行了进一步设计——对从键盘输入得数据进行冒泡排序这个算法程序较为复杂,为了使程序能够更加简洁明了,我对其进行了模块化设计,将输入、输出、冒泡排序等功能分离出来,用子程序一一实现由于键盘输入得数据并不能简单得从位数来判定输入输出,我设定将S pa ce作为分隔符,而结束输入时按Enter•键为了防止无用输入和输出数据时遗漏“0”,引入了首位符号标志来进行判定对算法进行模块化设计使得实现各功能时无需多重循环,原数据和排序后数据得输出都可由OUTPUT子程序实现,而最大值、最小值和平均值等都可以由ONE子程序实现单个数据得输出,极大得减少了算法得重复在这一阶段,我也遇到了一些困难难,例如在输入完数据回车后程序显示输入错误,经过排查才发现在一2号DOS功能调用时,只写了功能号而忘记“INT21H”,导致数据无法正常显示还有诸如子程序结束时没加返回指令R ET,命名过程名时与关键字重复,更改过程名后忘记修改跳转指令等等在发现错误和改正错误得过程中增强了我对汇编语言得掌握程度,对算法设计有了更深得了解接下来,我还对该算法程序进行了进一步优化,包括数据对齐,出错提示和进行有符号数得排序为了实现数据对齐,我增加了CRLF子程序,方便实现回车换行功能而为了在输入不合法时,进行错误提示,我定义了出错标志该算法可以对-32768——32767之间得整数进行冒泡排序,为了实现这一功能,我使用了符号标志进行判定,1为负数,0为正数在上机实验过程中,我对各条语句得含义都有了更深得理解,编写程序和独立解决问题得能力都得到了加强与此同时,我也认识到自己还有诸多不足,例如程序设计不够简洁,修改算法时往往不能前后兼顾,编写程序不够审慎等等,这些都就就是我在今后得日子里需要进一步学习和掌握得显示冒泡排序后得数据调用SORT子程序调用OUTPUT子程序显示最小值Min显示One子程序显示最大值Max调用On e子程序显示其余数平均值Av e调用On e子程序显示平均值二进制串Bin调用One子程序结束2冒泡排序子程序:SORTCO UNT1进入环次数COUNT2--内循环次初始化CO UNT1二N-1CO UNT2二COUNTS1二0就就是Ai与Ai+i两数交换C0UNT2二COUNTC0UNT2=0就就是COUNT1二C就就是
四、程序清单NAME BUBBLE SORTDATA SEGMENTARRAYDW5DUP;输入数据得存储单元COUNT DW5TWO DW2FLAG1DW0;判断符号标志FLAG2DB0;判断首位就就是否为零得标志FAULT DW-1;判断出错标志CR DBODH,OAH,$fSTR1D BPI easeinputf ive nu mberssep erated withspaceandfinished withEnter:1,1$STR2DBT he originalnum be rs:1,$STR4DBSTR5DB TheMax:S TR3DBThe sor tednumbers:r,,$STR6DB1Th eAv erag e:,$,STR7DB,Th eb ina ry syst emof theav erageD BSTR8Input err or!PIeas ei nputag ain!$D ATA ENDSCODE SEGMENTMAIN PROCFARAS SUME CS:CODE,DS:DA TA,ES:DAT ASTARTPUSH DSANDAX,0PUSH AXMOVAX,DATAMOV DS,AXLEA DX,ST R1;9号DOS功能MOV AH,09H调用,提示输入数据I NT21H;回车换行CALLCRLF;调用INPUT子程序,REIN:CALL INPUT输入原始数据;判断就就是否CMP AX,FAULT出错,JE REIN;出错则重新输入LEA DX,STR2MOV AH,O9H;9号DOS功能调用,提示输出原始数据I NT2CALL OUTPUT;调用OUTP UT子程序,输出原始数据;调用SORT子C ALLSORT程序,进行冒泡排序LEADX,ST R3;9号DOS功能调用,MOV AH,09H提示输出排序后得数据INT21HCAL LOUTPUT;调用OUT PUT子程序,输出排序后得数据ANDSI,0AN DBX,0MOVBX,ARRAY[SI];将最小值存入BX。
个人认证
优秀文档
获得点赞 0