1、【例】 从字节变量X单元开始,连续存放有100个无符号数,从中找出最大者送入MAX字节单元中。
分析:可把第一个数先送到AL中,将AL中的数与后面的99个数逐个进行比较,如果AL中的数大于或等于与之相比较的数,则转下一个数进行比较;若AL中的数小于相比较的数,则把相比较的数送入AL中,保证AL中的数始终处于较大的数。比较99次之后最大数必定在AL中,最后把AL中的数送入MAX单元。本例的特点:循环次数已知,因此可以用计数器来控制循环的执行。程序编写如下:
DATA SEGMENT
X DB 106,135,101,210,┉; 共100个
MAX DB ?
DATA ENDS
STAK SEGMENT STACK
DW 20H DUP(?)
STAK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA BX,X
MOV AL,[BX]
MOV CX,99
LOP: INC BX
CMP AL,[BX]
JAE L1
MOV AL,[BX]
L1 : LOOP LOP
MOV MAX,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、【例】 从自然数1开始累加,直到累加和大于等于1000为止,统计被累加的自然数个数存入字单元N中,累加和送入字单元SUM中。
分析:被累加的自然数个数事先是末知的,也就是说,循环的次数是末知的,因此不能用计数方法来控制循环。选择BX寄存器统计自然数的个数,而BX也是用来存放每次取得的自然数,用AX寄存器存放累加和,和≧1000是供判断的结束标志。源程序编写如下:
DATA SEGMENT
N DW ?
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,0
MOV AX,0 ;累加寄存器
LOP: INC BX
ADD AX,BX
CMP AX,1000 ;比较AX是否小于1000
JB LOP ;是则重复累加
MOV N,BX ;个数送N
MOV SUM,AX ;累加结果送SUM
MOV AH,4CH
INT 21H
CODE ENDS
END START
3、【例】 试编制一程序,求两个数组对应的数据之和,并把和数存入新数组SUM中。计算一直进行到两数之和为零或数组结束。将新数组的长度存于LEN单元中。编程如下:
DATA SEGMENT
DA1 DB 2,6,0 ,3,-5,0,10,-1
DA2 DB 4,7,-2,0,10,3,-10,32
COUNT EQU $-DA2
LEN DW ?
SUM DB 20 DUP(?)
DATA ENDS
STAK SEGMENT STACK
DW 50H DUP (?)
STAK ENDS
CODE SEGMENT
ASSUME CS: CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,-1 ;初始化地址指针
MOV CX,COUNT ;取数组的数据个数
LOP: INC BX
MOV AL,DA1[BX]
ADD AL,DA2[BX] ;对应数据求和
MOV SUM[BX],AL ;存和数
LOOPNZ LOP ;和不为0继续循环
INC BX ;修改新数组长度
L1: MOV LEN,BX ;存新数组长度
MOV AH,4CH
INT 21H
CODE ENDS
END START
4、【例】 已知字数组ARRAY,有50个元素,试编写程序,从中找出最大值,把结果放在MAX中。
程序一(找最大值):
. MODEL SAMLL
. DATA
ARRAY DW 50 DUP(?)
MAX DW ?
. CODE
START: MOV AX,@DATA
MOV DS,AX
LEA SI, ARRAY
MOV CX,49
MOV AX,[SI]
ADD SI,2
AGAIN: CMP AX,[SI]
JG NEXT
MOV AX,[SI]
NEXT: ADD SI,2
LOOP AGAIN
MOV MAX,AX
MOV AX,4C00H
INT 21H
END START
5、【例】 已知字数组ARRAY,有N个元素,试编写程序,把数组中的正数累加,结果放在SUM中(不考虑溢出),并统计正数个数,保存到COUNT。
程序二(求和,统计):
. MODEL SAMLL
. DATA
ARRAY DW N DUP(?)
SUM DW 0
COUNT DW 0
. CODE
START: MOV AX,@DATA
MOV DS,AX
LEA SI, ARRAY
MOV CX,N
AGAIN: MOV AX,[SI]
CMP AX,0
JLE NEXT
ADD SUM,AX
INC COUNT
NEXT: ADD SI,2
LOOP AGAIN
MOV AX,4C00H
INT 21H
END START
6、【例】 试编写程序,求级数12+22+32+? 的前n项和刚大于1000的项数n。并在屏幕上显示结果(用十六进制)。
(注:n是一个满足十六进制的各位数)
code segment
assume cs:code
start: mov bl,1 ;
mov cx,0 ;cx清零,用于统计级数的和
again: mov al,bl ;
mul bl ;求平方,指令也可使用imul
add cx,ax ;平方和
cmp cx,1000 ;比较cx是否大于1000
jg display ;是,则转入显示处理
inc bl ;不是,bl加1
jmp short again ;重复执行
display: mov dl,bl ;
cmp dl,9 ; 比较是否大于9
jg add37 ;是则转add37执行
add dl,30h ;不是,则加30h,把数符变成ASCII码
jmp next
add37: add dl,37h
next: mov ah,2 ;显示一个字符
int 21h
mov ah,4ch ;返回dos
int 21h
code ends
end start