1.初始化部分
2.循环体部分
3.循环控制部分
循环程序的常见结构形式如图4.5(a)、(b)所示。

4.2 单重循环程序设计
1.计数控制
【例4.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。
显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图4.6所示。

【例4.8】试编写一程序,要求比较两个字符串STR1和STR所含字符是否相同,若相同则显示‘MATCH!’,若不相同则显示‘NO MATCH!’。(程序略)
其流程图如图4.7所示。

2.条件控制
【例4.9】试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。
其流程图如图4.8所示。

程序如下:
STACK SEGMENT STACK
DB 200 DUP(0)
STACK EDNS
DATA SEGMENT
BUF DW 0011110010101011B
COUNT DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,BUF
MOV CL,0 ;计数器为0
COPA: AND AX,AX
JE EXIT ;(AX)=0,结束循环
SHL AX,1 ;AX 左移一位
JNC LOPA
INC CL ;产生进位,(CL)+1→CL
JMP LOPA
EXIT: MOV COUNT,CL
MOV AH,4CH
INT 21H
CODE ENDS
END START
4.3 多重循环程序设计
【例4.10】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。
我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。
数 10 8 16 90 32
第一遍 10 16 90 32 8
第二遍 16 90 32 10 8
第三遍 90 32 16 10 8
程序流程图如图4.9所示。

程序如下:
DATA SEGMENT
BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20
N=($-BUF)/2
DATA ENDS
STACK SEGNMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1: MOV DX,CX
MOV BX,0
LOOP2: MOV AX,BUF[BX]
CMP AX,BUF[BX+2]
JGE L
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX
L: ADD BX,2
DEC CX
JNE LOOP2
MOV CX,DX
LOOP LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
程序运行后,BUF区中的内容如下:
20,9,7,6,3,2,0,-4,-8,-9,-10
若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。


