首页 百科知识 循环程序设计

循环程序设计

时间:2022-10-17 百科知识 版权反馈
【摘要】:加法指令每执行一次,CX减1,直至减为0时,循环结束。循环程序设计中的重要问题是正确地控制循环,保证循环的正常执行和结束。如果循环控制有错,就会导致循环不能完成预定功能,或者循环不能结束,此时称为死循环,除非特殊需要,程序中不应出现死循环。此例中循环次数预先已知,所以可用CX作计数器控制循环次数。下面举例说明多重循环程序设计的方法。

2.6.4 循环程序设计

程序中如果根据条件重复执行一段指令就是循环,循环结构可用比较指令和条件转移指令实现。

例2-43 设50个字数据存放在以ARRAY为起始地址的存储区中,求ARRAY数组中的50个数之和,求和结果存入S字单元中,求和程序片段如下:

img138

在上例中,由CX作为计数器控制循环次数,使加法指令重复执行50次,将50个数累加在AX中。加法指令每执行一次,CX减1,直至减为0时,循环结束。如果没有循环结构,就必须将两条加法指令重复写50次,这显然在实际应用中是不可行的,循环结构可以大大简化编程工作,并减小程序长度。

要保证循环正常执行和结束,必须:(1)正确地初始化循环控制计数;(2)在循环体内必须有修改循环控制值的指令,为下一次循环设置条件并使循环能达到结束条件;(3)检测循环条件,控制程序转移。

指令系统提供了若干条设计循环结构的循环控制指令,循环控制指令可以同时完成修改循环控制计数、检测条件并控制转移的工作。因此用循环控制指令实现循环结构更加简便。

1.循环控制指令

循环控制指令的操作数为一个标号,当满足循环条件时,转移到标号指向的指令处开始重复执行一段程序,不满足循环条件时,退出循环,顺序执行循环控制指令后面的指令。循环可实现的转移在−128~+127字节范围内。

循环控制指令共有三条:

(1)LOOP指令

指令格式:LOOP 标号

执行操作:(CX)−1→(CX),若(CX)≠0,则转至标号处,重复执行循环体,若(CX)=0,则退出循环,继续往下执行。

(2)LOOPZ/LOOPE指令

指令格式:LOOPZ/LOOPE 标号

执行操作:(CX)−1→(CX),若(CX)≠0,且ZF=1时,转至标号处,重复执行循环体,否则退出循环,继续往下执行。

(3)LOOPNZ/LOOPNE指令

指令格式:LOOPNZ/LOOPNE 标号

执行操作:(CX)−1→(CX),若(CX)≠0,且ZF=0时,转至标号处,重复执行循环体,否则退出循环往下执行。

例2-44 使用循环控制指令改写前面50个数求和的程序段:

img139

如求一字符串的长度,并将其存入LEN字单元中。设字符串存放在起始地址为STR,长度为80个字节的存储区中。字符串以‘$’为结束标识符,字符串长度<80个字符。程序段如下:

img140

由上面两个例子可以看出三条循环指令的差别,它们的共同点是:都由CX寄存器作为循环控制计数器,当CX的值减为0时,循环结束;不同处是,LOOP命令仅由CX控制循环次数,而LOOPZ/LOOPE指令和LOOPNZ/LOOPNE指令则不仅由CX控制循环次数,同时还由ZF标志位配合CX共同控制循环次数。

如上例中,当(CX)还未减为0时,如果遇到字符串结束符“$”,此时该字符与AL中的“$”相等,ZF标志位被置为1,达到LOOPNE指令的循环结束条件,循环结束。因此,对于虽然循环次数还未达到((CX)≠0),但若达到相等/不相等条件时需要提前结束循环的情况,可以使用LOOPZ/LOOPE指令或LOOPNZ/ LOOPNE指令。

2.循环程序设计

循环程序设计中的重要问题是正确地控制循环,保证循环的正常执行和结束。如果循环控制有错,就会导致循环不能完成预定功能,或者循环不能结束,此时称为死循环,除非特殊需要,程序中不应出现死循环。控制循环通常分为两大类:

(1)计数循环(用于循环次数已知的情况)。

(2)条件循环(用于循环次数不确定的情况)。

例2-45 将一个16位二进制数的各位分离开并转换为ASCII码,从最高有效位开始依次逐位存入以BIN为起始地址的16个字节单元中。

img141

img142

程序逐次将二进制数的最高有效位用循环左移指令ROL分离出来,然后将分离出的各位二进制数转换为ASCII码存入BIN缓冲区,16次循环便分离完一个16位的二进制数。此例中循环次数预先已知,所以可用CX作计数器控制循环次数。

例2-46 把一个二进制数转换为八进制数,并把所得到的八进制数的各位数都转换为相应的字符(ASCII码)存入OBUF存储区中。

img143

img144

此例的循环次数不能事先确定,因为要使程序适用于转换任一个16位字长的数,就必须由条件而不是确定的循环次数来控制循环,因此在数据转换过程中依据除法的商是否为0决定循环是否结束。

分析上面两例,可以看到这两个循环程序的结构都是先执行循环体,后判断循环条件是否满足,如果条件一开始就不满足,也至少执行一次循环体,这种循环结构称为直到型循环结构;另一种常用的循环结构是先判断循环条件,后执行循环体,如果循环条件一开始就不满足,则循环体一次也不执行,这种循环结构称为当型循环结构。

例2-47 统计AX寄存器中的二进制数各位上“1”的总个数,程序段如下:

img145

img146

此例为当型循环结构,一开始若(AX)=0,循环体一次也不执行,因为如果AX中的数为0,就没有任何必要再执行统计“1”的指令。如果(AX)≠0,则程序循环结束时,CX中为(AX)各位上“1”的总个数统计值。

例2-48 将一正整数N插入到一个有序字类型数组中,数组中的所有正整数已按递增序排列。设数组的起始地址为ARRAY,长度为20个字单元,已存放10个正整数。

img147

img148

此例也是一个当型循环结构。程序采用的插入方法是:从数组中最后一个数开始,将要插入的数N与数组中的数从后至前逐一比较,若N小于等于被比较的数K,则数K向后移一个字单元,即将一个空单元向前移,为插入数N准备存放单元,N再继续向前比较,直到K≤N时,把数N插在数K后,结束循环。数组起始地址−2所指的单元(即X单元)中存放−1,是为了保证如果N是数组中最小的数时,由于N仍比−1小,故能插入在数组的第一个单元中。此例采用当型循环结构,使得如果N大于数组中最后一个数时,则一次循环也不必执行,可直接将N插在最后一个数后。数N小于数组中第一个数或大于最后一个数的情况是程序设计中的边界问题,在程序设计中必须周密考虑边界问题,才能保证程序在各种情况下都能正常完成预定功能。

3.多重循环程序设计

上一节例子中,程序都由一个循环结构组成,但一个循环结构常常难以解决实际应用问题,许多问题需要在循环结构中再组织循环,这种循环中套循环的结构称为多重循环,或称为循环嵌套。下面举例说明多重循环程序设计的方法。

例2-49 选择法排序。将数组中的10个数按从大到小的顺序排列。

img149

img150

选择法排序的方法是,第一轮排序时,第一个单元的数依次与该数后面的每一个数进行比较,大数交换到第一个单元中,比较到最后一个数为止,第一轮排序的结果是使第一个单元中换为最大数。第二轮排序时,第二个单元的数依次与该数后面的数相比,同样地,比较完最后一个数时,使第二个单元中换为次大数,对于n个数类似地完成n−1轮排序,使n个数从大到小以递减顺序排列。这样的一组数据排序问题需要用二重循环解决,外循环控制排序轮数,内循环具体完成一轮排序。

设计多重循环程序时,应注意下面两点:

(1)内层循环必须完全包含于外层循环内,不允许循环结构交叉。

(2)转移指令只能从循环结构内转出或可在同层循环内转移,而不能从一个循环结构外转入该循环结构内。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈