单循环程序的设计方法
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