汇编 循环程序设计
1. 循环的概念1.1 循环结构循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体;有两种循环结构如图(a)、(b)所示。循环指令LOOP格式:LOOP OPR执行操作:(CX)←(CX)−1(CX)\leftarrow (CX)-1(CX)←(CX)−1。若CX≠0CX\neq 0CX=0,跳转到标号OPROPROPR处循环操作;若CX=0CX=0CX=0,则退出循环,执行LOO
·
汇编 循环程序设计
一、循环结构
- 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体;
- 有两种循环结构如图(a)、(b)所示。
二、循环指令
2.1 LOOP
- 格式:
LOOP OPR
- 执行操作: ( C X ) ← ( C X ) − 1 (CX)\leftarrow (CX)-1 (CX)←(CX)−1。若 C X ≠ 0 CX\neq 0 CX=0,跳转到标号 O P R OPR OPR处循环操作;若 C X = 0 CX=0 CX=0,则退出循环,执行 L O O P LOOP LOOP的下一条指令。
- 举例:求
X
=
1
+
2
+
3
+
⋯
+
10
X=1+2+3+\cdots +10
X=1+2+3+⋯+10的累加值。
MOV AL,0 MOV BL,1 MOV CX,10 SS1:ADD AL,BL INC BL LOOP SS1 MOV X,AL
2.2 LOOPZ/LOOPE
- 格式:
LOOPZ/LOOPE OPR
- 执行操作: ( C X ) ← ( C X ) − 1 (CX)\leftarrow (CX)-1 (CX)←(CX)−1。若 C X ≠ 0 CX\neq 0 CX=0,并且 Z F = 1 ZF=1 ZF=1,跳转到标号 O P R OPR OPR处执行循环操作;若 C X = 0 CX=0 CX=0,或者 Z F = 0 ZF=0 ZF=0,则退出循环,执行 L O O P LOOP LOOP的下一条指令。
- 举例:取出字母串
A
L
P
H
A
ALPHA
ALPHA中的第一个小写字母放入
D
L
DL
DL。
MOV BX,-1 MOV CX,M SS2:INC BX MOV AL,ALPHA[BX] TEST AL,20H LOOPZ SS2 MOV DL,AL
2.3 LOOPNZ/LOOPNE
- 格式:
LOOPNZ/LOOPNE OPE
- 执行操作: ( C X ) ← ( C X ) − 1 (CX)\leftarrow (CX)-1 (CX)←(CX)−1。若 C X ≠ 0 CX\neq 0 CX=0,并且 Z F = 0 ZF=0 ZF=0,跳转到标号 O P R OPR OPR处执行循环操作;若 C X = 0 CX=0 CX=0,或者 Z F = 1 ZF=1 ZF=1,则退出循环,执行 L O O P LOOP LOOP的下一条指令。
- 举例:在长度为
M
M
M的字符串
S
Y
M
B
O
L
SYMBOL
SYMBOL中查找大写字母
A
A
A,在找到之后将其变为小写。
MOV BX,-1 MOV CX,M SS3:INC BX CMP SYMBOL[BX],'A' LOOPNE SS3 OR SYMBOL[BX],20H
三、单重循环
3.1 计数控制
-
当循环次数已知时,通常采用计数控制循环。
-
举例:编程计算1+2+3+…+50的和,结果送 RESULT单元。
data SEGMENT RESULT DW 0 data ENDS code SEGMENT ASSUME CS:code,DS:data START: MOV AX,data MOV DS,AX MOV CX,50 CLC NEXT: ADC RESULT,CX LOOP NEXT MOV AH,4CH INT 21H code ENDS END START
3.2 条件控制
-
条件控制循环,适合于循环次数未知的情况。
-
举例:在内存单元BUF中定义1个字数据,编程统计这个字数据中含1的个数,并将结果存入内存的字节单元COUNT 中。
DATA SEGMENT BUF DW 2345H COUNT DB 0 DATA ENDS STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,BUF MOV CL,0 COPA:AND AX,AX JE EXIT SHL AX,1 JNC COPA INC CL JMP COPA EXIT:MOV COUNT,CL MOV AH,4CH INT 21H CODE ENDS END START
4. 多重循环
- 循环中嵌套循环。
- 举例:在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按由大到小的顺序排列在BUF存储区中,试编程实现。
- 思路:采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一趟需比较(N-1)次,此时,最小的数已经放到了最后;第二趟比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三趟只需比较(N-3)次,……整个排序过程最多需(N-1)趟。如下面的4个数即是采用冒泡排序比较的例子。
- 程序流程图
- 源代码:
DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20 N=($-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV CX,N DEC CX NEXT1:MOV DX,CX ;趟数送dx中 MOV BX,0 ;BX为基地址 NEXT2:MOV AX,BUF[BX] ;每一趟中比较的次数 CMP AX,BUF[BX+2] JGE L XCHG AX,BUF[BX+2] MOV BUF[BX],AX L: ADD BX,2 DEC CX JNE NEXT2 MOV CX,DX LOOP NEXT1 ;趟数的比较 MOV AH,4CH INT 21H CODE ENDS END START
更多推荐
已为社区贡献2条内容
所有评论(0)