实际问题中,经常需要按照一定的规律,多次重复执行一串语句,这类程序叫做循环程序。用循环程序处理带重复性的问题,可以缩短源程序和目标程序。
图4-6 循环程序结构
1.循环程序结构
循环程序结构如图4-6所示,可分为五个部分:
(1)初始化部分
这是循环的准备部分,又分为两部分:一个是循环工作部分初始化;另一个是结束条件的初始化,为程序操作、地址指针、循环计数、结束条件等设置初值。
(2)循环工作部分
这是循环程序的主体,用来完成主要的计算任务和基本操作,该段就是要求重复执行的程序段。
(3)循环修改部分
修改循环工作部分的变量地址等,为下一次循环作准备。
(4)循环控制部分
它为下一轮处理而修改循环次数计数器或判断结束条件。每循环一次都要检验循环结束的条件,当满足条件时就停止循环,往下继续执行其他程序。
(5)循环结束部分
循环结束后,用于分析和存放结果。
2.循环的控制方法
循环程序设计中如何控制循环是很重要的一个环节,常见的两种控制方法是:计数控制和条件控制。
(1)计数控制
这种控制方法用于循环次数已知的情况。一般用LOOP指令实现,CX寄存器为循环计数器。
(2)条件控制
这种控制方法用于循环次数未知,但却已知一些循环或不循环的条件。通过测试指令判断条件是否满足,来决定继续循环或不循环。
(3)逻辑尺控制
这是汇编语言循环程序设计独有的方式。所谓逻辑尺,是指具有一定长度的一串二进制数。该方式按照逻辑尺的指示,决定对循环体中某一部分是执行或不执行。
有些问题可综合采用上述控制的方法处理循环。
3.循环程序设计
进行循环程序设计时,根据具体问题,可以采用单重循环结构,也可以采用多重循环结构(即循环里面套循环)。
例4-16 编程计算。(设和值不大于一个字)(www.xing528.com)
解题思路:求100个数之和,显然可以采用循环结构程序,并且循环次数已知,循环控制采用计数控制方法。程序设计如下:
例4-17 写一个把字符串中的所有大写字母改写为小写字母的程序。设字符串以“$”结尾。
解题思路:该程序的主体是一个循环次数不确定的循环(字符串的长度不确定),根据是否到达字符串尾这个条件来控制循环。
例4-18 设计一个程序,判断无符号字型数组BUFFER的若干个元素中是否含有数字0,如有则把第一个0元素所在存储单元的偏移地址送字型变量ADDR,如没有则将该变量的值置为0FFFFH。
解题思路:这是一个由计数和条件双重控制的循环,利用$运算符可求出字型数组BUFFER中的元素个数,从而确定循环的最大次数;但在循环过程中,如果特定条件满足,则提前退出循环。程序设计如下:
例4-19 设字型数组X、Y分别有12个元素,试形成一个Z数组,使该数组的各元素满足以下关系:
Z0=X0+Y0Z1=X1+Y1Z2=X2-Y2Z3=X3+Y3Z4=X4+Y4Z5=X5+Y5
Z6=X6+Y6Z7=X7-Y7Z8=X8-Y8Z9=X9+Y9Z10=X10+Y10Z11=X11-Y11
解题思路:在本例中,虽然Z数组的各元素都是通过X、Y数组的对应元素计算得来的,但运算操作符不同,且无规律可循,所以用前面介绍的循环方法难以实现。如果用0表示加运算,用1表示减运算,则12个式子的运算操作按Z11,Z10,Z9,…,Z0的顺序可表示为二进制数100110000100。为存放这个二进制数,可在内存中定义一个字变量,将二进制数作为该变量的低12位,变量的高4位无意义。这种存储单元一般被叫做逻辑尺。这样我们可以用循环结构实现上述功能,在循环体中每次将逻辑尺右移一位,然后用分支结构对移出位进行判断,以决定是加运算还是减运算。程序设计如下:
例4-20 用冒泡排序法对有符号字型数组ARY按升序排列。
解题思路:设数组元素个数为N,从第一个数开始依次对相邻的两个数进行比较,如果次序正确,则不做任何操作,否则两数互换位置。这样,在进行第一遍的(N-1)次比较后,最小或最大的数已放到最后位置。因为有一个数放到了正确位置,所以第二遍少比较一次,只需比较(N-2)次……依此类推,总共循环(N-1)遍,每遍的比较次数递减。
下面是对有7个元素的无序表进行冒泡排序(升序)的过程(方括号内为比较范围):
表的初始状态:[36486698751328]
第一遍比较之后:[364866751328]98
第二遍比较之后:[3648661328]7598
第三遍比较之后:[36481328]667598
第四遍比较之后:[361328]48667598
第五遍比较之后:[1328]3648667598
第六遍比较之后:13283648667598
下面用双重循环实现该算法,程序中内循环和外循环都用LOOP语句实现,注意由于内、外循环都要用到循环计数器CX,那么该如何保存当前内、外循环次数,而让CX值在两个嵌套的循环中应用不发生冲突,处理方法如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。