循环结构程序设计
在实际工作中,有时要求对某一问题进行多次重复处理,而仅仅只是初始条件不同,这种计算过程称之为具有循环特征的,而循环程序设计是解决这类问题的一种行之有效的方法。循环程序是采用重复执行某一段程序来实现要求完成计算的编程方法。
4.3.1循环结构简述:
循环结构在以前的课程中已经讲解过了,这里再简单的重复一下。
1.循环结构的组成:
循环结构主要有三部分组成:
1) 初始化部分:包括设置地址指针、计数器及其它变量的初值等为循环做的准备工作;
2) 循环体部分:这是主要部分,即对问题的处理;
3) 循环控制部分:包括每次执行循环体之后或之前参数的修改,对循环条件的判断等;
2.循环的分类:
按照“先判断”还是“先执行”,可以分成“当型循环”与“直到型循环”;按照循环条件,可以分成“循环次数已知”与“循环次数未知”。汇编语言程序设计中更主要的是按照是否已知循环次数来区分,分别写成不同形式的代码。
另外,还有是否有循环嵌套,分成单重循环结构与多重循环结构,这一点在汇编语言程序设计中也很重要;因为,前面讲过的指令LOOP是专门为已知循环次数而设置的,它的循环次数固定地存放在寄存器CX中,如果是循环嵌套,而且均为用LOOP来执行的话,需要注意CX的值是否冲突。
4.3.2 单循环程序的设计方法
1.“循环次数已知型”的程序设计
这种程序设计方法很直观、流程比较清晰,但必须在循环次数已知的的条件下才能采用。
例4.10:
在以NUM为首址的存区中存有一组带符号的字节类型的数据,从中找出最大数并送入MAX单元。
程序如下:
;…………数据段…………
DATA SEGMENT
NUM DB 7,9,-10,0,100,-27,99
COUNT DB $-NUM
MAX DB ?
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
;
MOV CL,COUNT-1
MOV CH,00H
;
MOV BX,OFFSET NUM
MOV AL,[BX]
;
LP1:INC BX
CMP AL,[BX]
JGE NEXT
MOV AL,[BX]
NEXT:LOOP LP1
MOV MAX,AL
;
HLT
CODE ENDS
END START
例4.11:
试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。
分析:要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器BL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。
程序如下:
;…………数据段…………
DATA SEGMENT
BUF DW 2345H
COUNT DW ?
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
;
MOV AX,BUF
MOV CX,16
MOV BL,0
;
LP1:SHL AX,1
JNC NEXT
INC BL
NEXT:LOOP LP1
;
MOV BH,0
MOV COUNT,BX
;
HLT
CODE ENDS
END START
2.“循环次数未知型”的程序设计
“循环次数未知型”的程序比较“循环次数已知型”要麻烦一些,不过可以节约许多计算机的资源,提高程序的工作效率,而且更接近实际情况,。
在例4.11中无论变量BUF中有没有1,均要循环16次,很显然可以进行一些改进。
例4.12:
题目与例4.11一致。
分析:要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器BL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环
程序如下:
;…………数据段…………
DATA SEGMENT
BUF DW 2345H
COUNT DW ?
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
;
MOV AX,BUF
MOV BL,0
;
LP1:ADD AX,AX
JZ EXIT
SHL AX,1
JNC NEXT
INC BL
NEXT:JMP LP1
;
MOV BH,0
MOV COUNT,BX
;
HLT
CODE ENDS
END START
例4.13:
在字符串变量STRING中存有一个以$为结尾的ASCII码字符串,现要求出字符串的长度,并把它存入LENGTH单元中。
程序如下:
;…………数据段…………
DATA SEGMENT
STRING DB ‘HDKAYFBKLA$’
LENGTH DB ?
DATA ENDS
;…………代码段…………
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
;
MOV BX,OFFSET STRING
MOV DI,0
;
LP1:MOV AL,[BX][DI]
CMP AL,‘$’
JZ EXIT
INC DI
JMP LP1
;
EXIT:MOV CX,DI
MOV LENGTH,CL
;
HLT
CODE ENDS
END START