汇编语言循环程序的控制方法

在顺序结构的程序中,每一个语句均被执行一次;而分支程序中的语句,有的被执行一次,有的却不被执行(未被选中的那些分支内的语句)。显然,出现在顺序结构程序或分支程序中的任一个语句,至多只被执行一次。但在实际问题的处理程序中,常常需要按照一定规律,多次重复执行一串语句,这类程序叫作循环程序。

一、循环程序的结构#

循环程序一般由 4 部分组成。

(1)循环初始化部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。

(2)工作部分:即需要重复执行的程序段。这是循环程序的核心,称为循环体。

(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。

(4)控制部分:用来保证循环程序按规定的次数或特定条件进行循环。

循环程序的常见结构形式如图 1(a)、图 1(b)所示。其中的工作部分与修改部分有时相互包含、相互交叉,不一定能明显区分开。

循环程序的结构形式

图 1 循环程序的结构形式

二、循环控制方法#

如何控制循环是循环程序设计中一个重要环节。下面介绍最常见的两种控制方法:计数控制和条件控制。

  1. 计数控制

当循环次数已知时,通常使用计数控制法。假设循环次数为 n,常常用以下两种方法实现计数控制。

(1)先将循环次数 n 送入循环计数器中,然后,每循环一次,计数器减 1,直至循环计数器中的内容为 0 时结束循环。例如:

计数控制

当 CX=N,N-1,…,1 时,重复执行循环体,当 CX=0 时,结束循环。

(2)先将 0 送入循环计数器中,然后每循环一次,计数器加 1,直至循环计数器的内容与循环次数 n 相等时退出循环。例如:

计数控制

当 CX=0,1,2,…,n-1 时,重复执行;当 CX=N 时,结束循环。

上述两种计数方法的共同特点是每循环一次之后,在计数器中计数一次。通常,称第 1 种方法为倒计数,称第 2 种方法为正计数。

对于上述第一个示例中的 LOOP LOOPA 语句,默认循环计数器为 CX。所以,在置初值部分要为 CX 置正确的初值,工作部分不能改变 CX 的内容。如果在循环体内要使用 CX,可将 CX 中的计数值入栈保护,在执行 LOOP 指令之前,再从栈中弹出计数值送入 CX。

LOOP LOOPA 语句可以用 DEC CX 和 JNZ LOOPA 两条语句代替,也可根据寄存器的分配情况,选用任一通用寄存器或存储单元作为循环次数计数器。

  1. 条件控制

有些情况下,循环次数无法事先确定,但它与问题中的某些条件有关。这些条件可以通过指令来测试。若测试比较的结果满足循环条件,则继续循环,否则结束循环。

示例:

条件控制

该程序段用来统计 AX 中 1 的个数。运行前并不知道 AX 的内容。若全是 0,则不必循环,直接转 EXIT,此时,寄存器 CL 中的 0 即为 AX 中 1 的个数。该程序循环次数随 AX 中的值的不同而不同。

以上介绍的两种循环控制方法是最常用的方法。在解决实际问题时,究竟应该选用哪种方式,往往要根据问题给定的已知条件,在认真分析算法之后才能确定。

(完)

comments powered by Disqus