首页 理论教育 实现循环程序结构的方法

实现循环程序结构的方法

时间:2023-02-28 理论教育 版权反馈
【摘要】:分析 这是一个求累加的程序。计数的初值为10,用CX表示,每加一次,计数值减1。其程序流程图如图4-9所示。在实际问题中,常常有循环次数未知的情况。对于这类问题,可以通过测试该条件来实现对循环的控制,这种方法就是条件控制法。例如,在数据和表格处理问题中,往往在数据和表格结尾添加一个结束标志,作为循环操作处理的条件,通过与结束标志的比较结果来控制循环。

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所示。

img81

图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所示。

img82

图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所示。

img83

图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所示。

img84

图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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈