排序设计从首地址为1000H开始存放50个数,要求设计程序将这些数由小到大排序,要求排序后的数,仍在该区域中。大的顺序排列在该存储区域中。对于这一问题可以采取逐一比较在以1000H为首地址的字节存储区中存放有n个无符号数,现需要将它们按从小到法。将第一个存储单元中的数与其后n-1个存储单元中的数逐一比较,每次比较之后,总是把小者放在第一个存储单元中,经过n-1次比较后,n个数种最小值存入了第一个存储单元中;接着将第二个存储单元中的数与其后n-2个数作比较,每次比较后把小者放在第二个存储单元中;……如此反复下去,最后两个存储单元之中的数比较完毕后,从小到大顺序就实现了。datasegmentcountdw?strdw61,50,48,47,46,45,44,33,42,41dw40,39,38,37,36,35,34,43,32,31dw30,49,28,27,26,25,14,23,22,21dw20,19,18,17,16,15,24,13,12,11dw10,9,8,7,6,5,4,3,1,2dataendscodesegmentassumecs:code,ds:datamainprocfarstart:pushdspushcxpushaxpushbxmovax,datamovds,axmovdi,strmovcx,50init:deccxjzsortedmovcx,countmovdi,0;初始化地址next:adddi,2movax,es:[di];将str第一个数送axcmpes:[di+2],ax;str前2个数做比较jnccont;不发生进位,[di+2]大,转contxchges:[di+2],ax;发生进位,两数互换moves:[di],axsubbx,bxcont:loopnext;计数器不为0,继续循环,该循环是作为内部循环,用以比较新进入的数与已比较过的数cmpbx,0jzinit;跳出外部循环,外部循环是用来计算总共应该比较多少次sorted:movdi,strdisp:movcx,0movah,02h;使用2号调用,每次单字符输出int21hcalldispall;调用输出调整retmainendpdispallprocnear;子程序功能:显示str中的数据leasi,strmovcx,1loop1:pushcxmovcx,100loop2:lodsbcalldisp_alcalldisp_splooploop2calldisp_crpopcxlooploop1calldisp_crretdispallendpdisp_alprocnear;子程序功能:按16进制方式显示AL中的数值pushcxmovbl,almovdl,blmovcl,4roldl,clanddl,0fhcalldisp4;显示字节高4位movdl,blanddl,0fhcalldisp4;显示字节低4位popcxretdisp_alendpdisp4procnear;子程序功能:将DL中的4bits数值用ASCII显示出来adddl,30h;由数值转为对应的ASCII码cmpdl,3ah;是'0'~'9'转dddjbdddadddl,27h;是'A'~'F'ddd:movah,02hint21h;调用DOS功能,显示DL中的字符retdisp4endpdisp_crprocnear;子程序功能:显示回车换行movah,02hmovdl,0dhint21hmovah,02hmovdl,0ahint21hretdisp_crendpdisp_spprocnear;子程序功能:显示空格movah,02hmovdl,''int21hretdisp_spendppopbxpopaxpopcxpopdsexit:movah,4chint21hcodeendsendstart