4.4.2 实现循环程序结构的方法
汇编语言的循环结构与高级语言的相比,有其自身的特点,常用的循环控制方法有计数控制、条件控制。
1.计数控制
计数控制适用于循环次数已知的情况,包括正计数与倒计数两种方法。设循环次数为N,则基本结构如下:
(1)正计数。
MOV CX,0 ;设置计数器初值为0
NEXT: …
INC CX;计数器值加1
CMP CX,N;CX与终值N比较
JNE NEXT;不为0,到NEXT处继续
(2)倒计数。
MOV CX,N;设置计数器初值为N
NEXT: …
DEC CX;CX值减1
JNZ NEXT;不为0,到NEXT处继续
利用LOOP指令可简化为:
MOV CX,N
NEXT: …
LOOP NEXT
显然,使用倒计数更简洁。在采用计数方法控制循环结构时,使用倒计数法。
【例4-8】 设内存BUF开始的单元中依次存放着10个8位无符号数,求它们的和并放在SUM单元中,试编写程序。
分析 这是一个求累加的程序。计数的初值为10,用CX表示,每加一次,计数值减1。其程序流程图如图4-9所示。
图4-9 例4-8程序流程图
DATA SEGMENT
BUF DB X1,…,X10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,BUF;设地址指针
MOV CX,10;设计数初值
XORAX,AX;设累加器初值,清零
AGAIN:ADD AL,[SI]
ADC AH,0
INC SI;改变指针
DEC CX
JNZ AGAIN;判断循环是否结束
MOV SUM,AX
MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
【例4-9】 编程实现将以BUF为首地址的10个字数组传到以BUF1为首地址的存储区。
分析 本题设置两个指针分别指向BUF和BUF1的首地址,每传一个数,指针指向下一个地址。其流程图如图4-10所示。
图4-10 例4-9程序流程图
程序如下:
DATA SEGMENT
BUF DW X1,…,X10
BUF1 DW 10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,BUF
LEA DI,BUF1;设置指针初始值
MOV CX,10;设置计数初值
LP:MOV AX,[SI]
MOV[DI],AX;将BUF的内容送BUF1
ADD SI,2
ADD DI,2;修改指针
DEC CX
JNZ LP;判断循环次数是否结束
MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
【例4-10】 在给定n个16位数组中,找出大于零、等于零和小于零的个数,将结果紧跟着原数组存放。
分析 这是一个统计问题,须设定3个计数器分别统计三种情况下的结果。其流程图如图4-11所示。
图4-11 例4-10程序流程图
程序如下:
DATA SEGMENT
BUF DW X1,X2,X3,…,Xn
COUNT EQU$-BUF ;COUNT的值为BUF所占的字节数
PLUS DB ?;存放正数的个数
ZERO DB?;存放零的个数
MINUS DB?;存放负数的个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,COUNT
SHRCX,1;相当于除以2,正好为BUF中的数;据个数
MOV DX,0;设定计数器初值
MOV AX,0;设定计数器初值
LEA BX,BUF;取BUF的偏移地址
LP:CMP WORD PTR[BX],0
JG E PLU;大于等于0,则转PLU
INC AH;<0,则统计
JMP NEXT
PLU:JZ ZER;=0,则转ZER
INC DL;>0,则统计
JMP NEXT
ZER:INC DH;=0,则统计
NEXT:ADD BX,2;改变原数组指针
LOOP LP
MOV PLUS,DL
MOV ZERO,DH
MOV MINUS,AH
MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
2.条件控制
在实际问题中,常常有循环次数未知的情况。此时,就必须通过特定条件来控制循环。对于这类问题,可以通过测试该条件来实现对循环的控制,这种方法就是条件控制法。在实际问题中,循环次数未知的循环是很多的。例如,在数据和表格处理问题中,往往在数据和表格结尾添加一个结束标志,作为循环操作处理的条件,通过与结束标志的比较结果来控制循环。
【例4-11】 从键盘输入一系列字符,以字符“$”为结束符,然后对其中的非数字字符进行统计。程序流程图如图4-12所示。
图4-12 例4-11程序流程图
程序如下:
DATA SEGMENT
BUF DB 50 DUP(?)
COUNT DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV AX,DATA
MOV DS,AX
START:LEA BX,BUF
INPUT:MOV AH,01H;调1号从键盘上输入一个字符
INT 21H
MOV[BX],AL;存入BUF存储区
INC BX
CMP AL,′$′;比较该字符与“$”
JNZ INPUT
LEA BX,BUF;将指针重新指向BUF首地址
NEXT:MOV CL,[BX]
INC BX
CMP CL,′$′;取的字符与“$”比较
JZ EXIT;相等,则退出
CMP CL,30H;与0的ASCII码比较
JB COUT
CMP CL,39H;与9的ASCII码比较
JBE NEXT
COUT:INC COUNT;统计非数字字符个数
JMP NEXT
EXIT:MOV AH,4CH;返回DOS
INT 21H
CODE ENDS
END START
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。