多重循环程序设计
在实际工作中,一个循环结构常常难以解决实际应用问题,所以人们引入了多重循环,这些循环是一层套一层的,因此又称为循环的嵌套。
在某些时候,循环次数是已知的,每一层循环均用到CX作为循环次数指针,就需要注意在进入内层循环的时候,利用堆栈将外层的当前循环次数保存起来。
例4.14:
统计一个班级学生的总分。
分析:对于每个学生而言,需要循环累加各门成绩,对于班级而言,需要对每个学生进行循环操作。
程序如下:
;…………源程序…………
;…………数据段…………
DATA SEGMENT
;假设有三个学生,五门功课
X1 DB 70,90,80,76,89,?
X2 DB 89,70,67,90,100,?
X3 DB 90,90,98,100,79,?
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;
MOV BX,0;也可以写成MOV BX,OFFSET X1
MOV CX,3
;
LP2:
PUSH CX
MOV DI,0
MOV CX,5
XOR AX,AX
LP1:
MOV AH,[BX][DI]
ADD AL,AH
INC DI
LOOP LP1
MOV [BX][DI],AL
POP CX
ADD BX,6
LOOP LP2
;
HLT
CODE ENDS
END START
在某些时候,多重循环的循环次数是未知的,这个时候一般有一些事先设定的结束标志,需要注意数据段的设置。
例4.15
统计班级每个学生的总分,并送到变量ZF中;其中-99表示班级成绩表结束,-9表示个人成绩表结束,-1表示没有成绩。
程序如下:
;…………源程序…………
;…………数据段…………
DATA SEGMENT
CJ DB 60,89,70,90,-1,90,-9
DB 90,89,99,80,90,100,-9
DB 78,87,89,85,88,83,-9
DB -99
ZF DW 100 DUP(?)
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
;
MOV BX,OFFSET CJ
MOV DI,OFFSET ZF
;
LP2:
MOV DX,0
LP1:
MOV AL,[BX]
CMP AL,-99
JNG EXIT
CMP AL,-9
JNG NEXT
CMP AL,-1
JNG LP
ADD DL,AL
ADC DH,0
LP:
INC BX
JMP LP1
NEXT:
MOV [DI],DX
INC DI
INC DI
JMP LP2
;
EXIT:HLT
CODE ENDS
END START
对于这种多重循环,一般尽量使用不同的寄存器作为不同层次的循环指针,如果没有多余的空闲寄存器,则应该与上面一样,在进入下一层循环时候,保存当前的循环指针的值。