WORD格式一、实验目的(1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。
(2)理解并掌握各种指令的功能,编写完整的汇编源程序。
(3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。
二、实验内容及要求(1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。
(2)实验要求:①编制程序,对这组数进行排序并输出原数据及排序后的数据;②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化;③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值;④用压栈PUSH和出栈POP指令,将平均值按位逐个输出;⑤将平均值转化为二进制串,并将这组二进制串输出;⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。
三、程序流程图开始(1)主程序:MAIN初始化键盘输入数据调用INPUT子程序显示输入错误否输入是否正确是显示原始数据调用OUTPUT子程序WORD格式显示冒泡排序后的数据调用SORT子程序调用OUTPUT子程序显示最小值Min显示One子程序显示最大值Max调用One子程序显示其余数平均值Average调用One子程序显示平均值二进制串Binary调用One子程序结束(2)冒泡排序子程序:SORTCOUNT1----外循环次数进入COUNT2----内循环次数i----数组下标初始化COUNT1=N-1COUNT2=COUNT1SI=0否Ai≥i A+1是Ai与A i+1两数交换SI=SI+2COUNT2=COUNT2-1否COUNT2=0?是COUNT1=COUNT1-1否COUNT2=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码比较,判断该数是否为"0"JNEQUIT3MOVAH,02H;2号DOS功能调用,输出"0"INT21HQUIT3:POPDIPOPSIPOPCXPOPBXANDFLAG2,0;将首位标志FLAG2重新置0RETONEENDP;--------------------------------------------------------------------------------------------------------------------------------子程序: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功能:冒泡排序;--------------------------------------------------------------------------------------------------------------------------------SORTPROCCLDMOVCX,COUNT;初始化计数器CXDECCX;CX=4LOO1:MOVDI,CX;CX中的数存入DIANDSI,0LOO2:MOVAX,ARRAY[SI]CMPAX,ARRAY[SI+2];相邻两数进行比较JLLOO3XCHGAX,ARRAY[SI+2];前一数较大则进行数据交换MOVARRAY[SI],AXLOO3:ADDSI,2;前一数较小,则进行下一组比较LOOPLOO2;CX=0,停止内循环MOVCX,DI;还原计数器CX的值LOOPLOO1;CX=0,停止外循环RETSORTENDP;--------------------------------------------------------------------------------------------------------------------------------CODEENDSENDSTART五、运行结果(1)对300,250,280,240,260五个数进行冒泡排序,运行结果如下:(2)对-1,2,54,-38,43五个数进行冒泡排序,运行结果如下(1)当输入不合法时,出现错误提示:(4)当输入数据不足5个时程序自动补0:六、心得体会在本次汇编语言程序设计实验中,我们学习了汇编语言的循环结构,并对冒泡排序法进行了汇编程序设计,我首先编写了对给定数据进行冒泡排序的算法设计,这有助于我熟悉冒泡排序的逻辑结构,理清设计思路。