一、实验目的(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)冒泡排序子程序:SORT否是否是否是进入初始化COUNT1=N-1COUNT2=COUNT1SI=0COUNT1----外循环次数COUNT2----内循环次数i----数组下标Ai≥Ai+1Ai与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功能调用,提示输出排序后的数据INT21HCALLOUTPUT;调用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号功能调用,返回DOSMAINENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:CRLF功能:回车和换行;--------------------------------------------------------------------------------------------------------------------------------CRLFPROCLEADX,CRMOVAH,09HINT21HRETCRLFENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:INPUT功能:输入一组数据;--------------------------------------------------------------------------------------------------------------------------------INPUTPROCMOVCX,COUNT;计数器CX=5ANDSI,0NEXT1:CALLDTB;调用DTB子程序,将输入转换为二进制数DECCX;CX←CX-1CMPDL,20H;判断输入字符是否为空格符JESTOCMPDL,0DH;判断输入字符是否为换行符JEEXIT2CALLCRLFERROR:LEADX,STR8MOVAH,09H;9号DOS功能调用,提示输入不合法INT21HCALLCRLFMOVAX,FAULT;以AX中的值作为出错标志JMPEXIT3STO:MOVARRAY[SI],BX;是空格符,将BX中的二进制数存入存储单元ADDSI,2JMPNEXT1EXIT2:MOVARRAY[SI],BX;是换行符,将BX中的二进制数存入存储单元CALLCRLFEXIT3:RETINPUTENDP;--------------------------------------------------------------------------------------------------------------------------------子程序: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:RETDTBENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:OUTPUT功能:输出一组数据;--------------------------------------------------------------------------------------------------------------------------------OUTPUTPROCCALLCRLFMOVDI,COUNT;计数器DI=5ANDSI,0GO1:MOVBX,ARRAY[SI];将存储单元的第一组数据存入BXTESTBX,8000H;判断正负JZGO2MOVDL,2DHMOVAH,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码比较,判断该数是否为0JNEQUIT3MOVAH,02H;2号DOS功能调用,输出0INT21HQUIT3:POPDIPOPSIPOPCXPOPBXANDFLAG2,0;将首位标志FLAG2重新置0RETONEENDP;-----------------------------------------------------------------------------------------------------------