- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章程序设计四
宁波大学科技学院计算机系 第五章 程序设计(四) 多重循环程序设计 一、多重循环的实现 实现多重循环的方法有两种: 1、各层循环全部采用LOOP指令实现 优点:使用LOOP能使程序结构清晰,可读性好; 缺点:LOOP指令只能使用CX记数,进入内循环前要保存外层的CX值; 2、各层循环采用条件转移指令实现 优点:可以使用不同的寄存器或变量作为循环记数器,各层循环记数器之间没有共享冲突; 缺点:使用条件转移指令实现循环使得程序的结构不好,可读性差 注意:无论使用上述哪种方法,其转移的偏移量只有8位!尤其注意最外层循环体的长度。 超长的解决办法可以使用过程调用。 1、各层循环全部采用LOOP指令实现 问题的提出:如果多重循环中每一层循环都采用LOOP指令来控制,由于LOOP指令默认的循环控制器是CX,因此导致各层循环对CX的使用产生共享冲突。 解决思路:进入内循环前将外循环记数CX的值保存起来,内循环完成时再恢复。 解决办法:使用堆栈的后进先出的特点来保存和恢复各层CX的值是解决该问题的最好方法。 在进入内层循环之前将存放外层循环记数寄存器CX的值进栈保存,内层循环结束后再弹出。 由于先进堆栈的数据后弹出,所以能够自动实现第1层循环的CX最后才弹出,从而保证了循环嵌套的正确性。 下面以3层循环为例给出程序结构图: LOP3: MOV CX,初值3 …… LOOP LOP3 LOP2: MOV CX,初值2 …… PUSH CX POP CX …… LOOP LOP2 LOP1: MOV CX,初值1 …… PUSH CX POP CX …… LOOP LOP1 例1:显示九九乘法表(9行9列输出) 寄存器设置:使用BL放被乘数,BH放乘数 CX ←9 BL←1 LOP1: PUSH CX CX←9 BH←1 LOP2: 求BL*BH的值 输出该项 INC BH LOOP LOP2 换行 INC BL POP CX LOOP LOP1 2、各层循环采用条件转移指令实现 为了回避将CX进栈出栈的麻烦,我们自然会想到不要将各层循环记数全都用CX,而是使用其它寄存器或变量来实现。 如果是这样,那我们就不能使用LOOP来实现循环了,因为LOOP指令只认CX。 不能用LOOP指令,当然就只能用条件转移语句了。 下面以使用不同的变量为例给出用条件转移指令实现3重循环的程序结构: LOP1: MOV X1,初值1 …… …… DEC X1 JNZ LOP1 LOP2: MOV X2,初值2 …… …… DEC X2 JNZ LOP2 LOP3: MOV X3, 初值3 …… DEC X3 JNZ LOP3 二、多重循环应用举例 1、数组排序 2、十进制转换为二进制常用算法 1、数组排序 例2:键盘输入N(N=9)个十进制数,将其按升序排序,再换行输出排序后的数列。 分析: 实现数组升序排序最简单的方法是冒泡或沉底排序法。 冒泡或沉底排序法的基本思想是: 设想将数组A竖立,将每个元素看成是重量为A[i]的 气泡。 根据轻的气泡不能置于重的气泡之下的原则,扫描 数组,遇到轻气泡在重气泡之下的情况就进行交换使轻者 在上重者在下; 如果每一
文档评论(0)