汇编 循环程序设计

一、循环结构

  • 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体;
  • 有两种循环结构如图(a)、(b)所示。

二、循环指令

2.1 LOOP

  1. 格式:LOOP OPR
  2. 执行操作: ( 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的下一条指令。
  3. 举例:求 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

  1. 格式:LOOPZ/LOOPE OPR
  2. 执行操作: ( 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的下一条指令。
  3. 举例:取出字母串 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

  1. 格式:LOOPNZ/LOOPNE OPE
  2. 执行操作: ( 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的下一条指令。
  3. 举例:在长度为 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              
    
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐