- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二十三讲 汇编语言经典程序设计(下) * 三、排序程序设计 排序程序设计是对某数据块中的数据按大小进行排队,使数据块中的数据排列有序。 设在某数据块中有n个数据a0、a1、a2、…ai、ai+1、…an-1,对应的存储器地址是addr0、addr1、…addri、addri+1、…addrn-1,如表4-3所示。若要求在原来的存储器区域内,将这n个数据从小到大进行排队。 排序程序是一个经典的程序,其算法一般采用冒泡法。什么是冒泡法呢? * 冒泡法 冒泡法又称两两比较法,其过程是先从头(addr0、addr1)开始取两个数据a0、a1,比较它们的大小,确定它们是否“大小有序”,即是否小的在前面,大的在后面。如果不是,将这两个数据交换位置;如果是“大小有序”,则不交换它们的位置。 接着从addr1、addr2再取两个数据进行比较,同样确定是否“大小有序”,并做相应的处理。经过n-1次处理,一轮冒泡结束,其结果是把n个数据中最大数放置在最高位addrn-1。 * 冒泡法续 经过一轮的冒泡不能完成数据排队“整齐”,往往需要经过多轮冒泡后才能使数据块中的数据全部“大小有序”。 第二轮冒泡的方法与第一轮冒泡类似,也是从头开始,即从addr0、addr1开始比较,只是比较的次数可以比前一轮少一次,第二轮冒泡的结果是把数据块中的第二大的数放置在addrn-2位置上。 经过多轮冒泡后,数据块中的数据就能排列整齐了。 那么究竟需要几轮冒泡才能完成排队呢?程序通过什么条件才能判断排队完毕呢? 方法是,通过跟踪每一轮冒泡过程中是否进行数据互换位置来判断是否需要进行下一轮冒泡! * 例4-22 若有8个不带符号的单字节数据存放在以30H为首地址的内部数据存储器中,编制一个子程序,使数据从小到大进行排列。若这8个数据分别为50,38,7,13,59,44,78,22。 解:根据以上对冒泡法排序过程的分析,在程序设计时应考虑用双循环的程序结构,用一个内循环体程序段完成一个轮次的冒泡,用一个外循环负责判断排序过程是否结束,准备下一轮次的冒泡。排序程序的流程图如下所示。 * 流程图 * 例4-22源程序 ;无符号单字节数据从小到大排序子程序 ;入口参数:子程序名SORT,数据块首地址为30H,数据个数为8。 影响1区的工作寄存器(R0,R1,R7),以及特殊功能寄存器B。 ;出口参数:排序后数据存放在首地址为30H的内部数据存储器中。 * 例4-22源程序续 SORT: PUSH PSW; 保护现场. PUSH ACC; MOV PSW, #08H; 将工作寄存器设置在1区。 MOV B, #7; 将内循环次数暂存在B。 START: MOV R7, B; 内循环次数传递至R7。 MOV R0, #30H; 设置数据区指针。 CLR 00H; 将交换标志清0。 LOOP: MOV A, @R0; 取数ai至ACC。 INC R0; MOV 09H, @R0; 取数ai+1至09H单元。 CJNE A, 09H, COMP; 比较两数ai 、ai+1。 * 例4-22源程序续 COMP: JC NEXT; 若ai+1 ai,转入NEXT。 ? XCH A, @R0; 若ai+1 ≤ai,两数ai 、ai+1交换位置。 DEC R0; XCH A, @R0; SETB 00H; 将交换标志置1。 INC R0; 调整指针。 NEXT: DJNZ R7, LOOP; 一轮冒泡未结束,则转入LOOP。 JNB 00H, STOP; 若排序结束,则转入STOP。 DJNZ B, START; 修改下一轮内循环次数,并判断 ;排序是否结束。 STOP: POP ACC; 若排序结束,恢复现场。 POP PSW; 恢复现场。 RET; 子程序返回。 * 实验七:排序程序设计 一、实验目的 熟悉8051指令系统,掌握程序设计方法。 二、实验工具 采用软件工具Keil μVision2。 三、实验内容 编写并调试一个排序子程序,其功能为用冒泡法将内部RAM 50~59H中的10个单字节无符号二进制整数从小到大的次序重新排列。 * 程序编制 ;无符号单字节数据从小到大排序子程序 ;入口参数:子程序名SORT,数据块首地址为50H,数据个数为10。 ;出口参数:排序后数据存放在首地址为50H的内部数据存储器中。 ORG 0000H SJMP MAIN ORG 0030H MAIN: MOV SP, #80H MOV R0, #50H MOV R7, #10 MOV A, R7 LOP: MOV @R0, A INC R0 DEC A; DJNZ
文档评论(0)