您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 史上最牛最完整的汇编语言冒泡排序程序
;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。;程序代码M_DIRECTMACROSTRING;定义一个宏,调用09号DOS功能在屏幕上显示一个字符串MOVDX,OFFSETSTRINGMOVAH,09INT21HENDMDATASEGMENTDIR1DB'countofnumberstosort:$';提示输入要排序的数据的个数DIR2DB'pleaseinputsortingnumbers:$';提示输入要排序的数据DIR3DB'sortingresult:$';在屏幕上提示排好续的数据DIR4DB'*************************$'DIR5DB'pleasechooseu(up)ord(down):$'DIR6DB'inputerror$'COUNT=100WTEMPDW?ARRAYDWCOUNTDUP(?);用来保存输入的数据CRLFDB13,10,'$';实现回车换行的功能,13→0DH,回车;10→0AH,换行LENDW?;保存实际输入的数据的个数DATAENDS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSSUBAX,AX;置AX为0PUSHAXMOVAX,DATA;将数据段的地址送到DX中MOVDS,AXREAD:M_DIRECTDIR1;宏调用,在屏幕上提示输入要输入的数据的个数CALLP_GETNEW;调用子程序P-GETNEW,输入要输入的数据的个数MOVCX,AXMOVLEN,AXLEABX,ARRAYMOVAH,09;调用09号功能,实现回车换行LEADX,CRLFINT21H;屏幕提示输入要排序的数据M_DIRECTDIR2GETNUMBER:CALLP_GETNEW;输入数据并保存到ARRAY中MOV[BX],AXADDBX,2LOOPGETNUMBERSORT:MOVCX,LEN;排序程序部分DECCXMOVAH,09HLEADX,CRLFINT21HM_DIRECTDIR5COMPARE:MOVAH,01HINT21HCMPAL,'U';判断是升序排序还是降序排序JZUP;输入的字符是U或u跳转到升序排序程序CMPAL,'u'JZUPCMPAL,'D';输入的字符是D或d跳转到降叙排序程序JZDOWNCMPAL,'d'JZDOWNUP:MOVDI,CX;升序排序程序MOVBX,0LOOP1:MOVAX,ARRAY[BX]CMPAX,ARRAY[BX+2]JNGECONTINUE1XCHGAX,ARRAY[BX+2]MOVARRAY[BX],AXCONTINUE1:ADDBX,2LOOPLOOP1MOVCX,DILOOPUPJMPOUTPUT;排序完后跳转到输出程序部分DOWN:MOVDI,CX;降序排序程序MOVBX,0LOOP2:MOVAX,ARRAY[BX]CMPAX,ARRAY[BX+2]JGECONTINUE2XCHGAX,ARRAY[BX+2]MOVARRAY[BX],AXCONTINUE2:ADDBX,2LOOPLOOP2MOVCX,DILOOPDOWNJMPOUTPUT;排序完后跳转到输出程序部分OUTPUT:MOVAH,09;回车换行LEADX,CRLFINT21HM_DIRECTDIR3MOVCX,LEN;为输出程序设置好入口参数MOVBX,OFFSETARRAYWRITE:MOVAX,[BX];输出排好序的数据MOVWTEMP,AX;将入口参数存放到共享变量中CALLP_OUTPUTADDBX,2MOVDL,20H;显示空格,将两个输出的数据分开MOVAH,02HINT21HLOOPWRITEMOVAH,09;隔离两次输入排序输出的作用LEADX,CRLFINT21HM_DIRECTDIR4MOVAH,09;实现循环输入数据并排序输出LEADX,CRLFINT21HLOOPREADRETMAINENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;从键盘上输入一个数据的子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_GETNEWPROCPUSHBX;出口参数:AX=补码表示的二进制数PUSHCX;说明:负数用“-”引导,数据范围是+32767~-32768PUSHDXXORBX,BX;BX保存结果XORCX,CX;CX为正负标志,0为正,-1为负MOVAH,1;输入一个字符INT21HCMPAL,'+';是“+”,继续输入字符JZREAD1CMPAL,'-';是“—,设置-1标志JNZREAD2MOVCX,-1READ1:MOVAH,1;继续输入字符INT21HREAD2:CMPAL,'0';不是0~9之间的字符,则输入数据结束JBREAD3CMPAL,'9'JAREAD3SUBAL,30H;是0~9之间的字符,则转换为二进制数;利用移位指令,实现数值乘10:BX←BX*10SHLBX,1MOVDX,BXSHLBX,1SHLBX,1ADDBX,DXMOVAH,0ADDBX,AX;已输入数值乘10后,与新输入的数值相加JMPREAD1;继续输入字符READ3:CMPCX,0;是负数,进行求补JZREAD4NEGBXREAD4:MOVAX,BX;设置出口参数POPDXPOPCXPOPBXRET;子程序返回P_GETNEWENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;用冒泡法排序的子程序(从大到小);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_SORTPROC;RET;子程序返回;P_SORTENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;数据输出子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_OUTPUTPROCPUSHAX;入口参数:共享变量WTEMPPUSHBXPUSHDXMOVAX,WTEMP;取出显示的数据TESTAX,AX;判断数据是零、正书还是负数JNZWRITE1MOVDL,'0';是‘0’,显示‘0’后退出MOVAH,2INT21HJMPWRITE5WRITE1:JNSWRITE2;是负数,显示“-”MOVBX,AX;AX数据暂存于BXMOVDL,'-'MOVAH,2INT21HMOVAX,BXNEGAX;数据求补(绝对值)WRITE2:MOVBX,10PUSHBX;10压入堆栈,做为推退出标志WRITE3:CMPAX,0;数据(商)为零,转向显示JZWRITE4SUBDX,DX;扩展被除数DX.AXDIVBX;数据除以10ADDDL,30H;余数(0~9)转换为ASCⅡ码PUSHDX;数据各位先低位后高位压入堆栈JMPWRITE3WRITE4:POPDX;数据各位先高位后低位弹出堆栈CMPDL,10;是结束标志10,则退出JEWRITE5MOVAH,2;进行显示INT21HJMPWRITE4WRITE5:POPDXPOPBXPOPAXMOVDL,20HMOVAH,02HINT21HRET;子程序返回P_OUTPUTENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODEENDSENDSTART
本文标题:史上最牛最完整的汇编语言冒泡排序程序
链接地址:https://www.777doc.com/doc-7026168 .html