彙編之循環程序設計

循環程序設計

1. 循環結構

  • 循環結構一般是根據某一條件判斷爲真或假來確定是否重複執行循環體;
  • 有兩種循環結構如圖(a)、(b)所示。

2. 循環指令

2.1 LOOP

  1. 格式:LOOP OPR
  2. 執行操作:(CX)(CX)1(CX)\leftarrow (CX)-1。若CX0CX\neq 0,跳轉到標號OPROPR處循環操作;若CX=0CX=0,則退出循環,執行LOOPLOOP的下一條指令。
  3. 舉例:求X=1+2+3++10X=1+2+3+\cdots +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. 執行操作:(CX)(CX)1(CX)\leftarrow (CX)-1。若CX0CX\neq 0,並且ZF=1ZF=1,跳轉到標號OPROPR處執行循環操作;若CX=0CX=0,或者ZF=0ZF=0,則退出循環,執行LOOPLOOP的下一條指令。
  3. 舉例:取出字母串ALPHAALPHA中的第一個小寫字母放入DLDL
	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. 執行操作:(CX)(CX)1(CX)\leftarrow (CX)-1。若CX0CX\neq 0,並且ZF=0ZF=0,跳轉到標號OPROPR處執行循環操作;若CX=0CX=0,或者ZF=1ZF=1,則退出循環,執行LOOPLOOP的下一條指令。
  3. 舉例:在長度爲MM的字符串SYMBOLSYMBOL中查找大寫字母AA,在找到之後將其變爲小寫。
	MOV BX,-1
	MOV CX,M
SS3:INC BX
	CMP SYMBOL[BX],'A'
	LOOPNE SS3
	OR SYMBOL[BX],20H

3. 單重循環

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              
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章