循環程序設計
1. 循環結構
- 循環結構一般是根據某一條件判斷爲真或假來確定是否重複執行循環體;
- 有兩種循環結構如圖(a)、(b)所示。
2. 循環指令
2.1 LOOP
- 格式:
LOOP OPR
- 執行操作:(CX)←(CX)−1。若CX=0,跳轉到標號OPR處循環操作;若CX=0,則退出循環,執行LOOP的下一條指令。
- 舉例:求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
- 執行操作:(CX)←(CX)−1。若CX=0,並且ZF=1,跳轉到標號OPR處執行循環操作;若CX=0,或者ZF=0,則退出循環,執行LOOP的下一條指令。
- 舉例:取出字母串ALPHA中的第一個小寫字母放入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
- 執行操作:(CX)←(CX)−1。若CX=0,並且ZF=0,跳轉到標號OPR處執行循環操作;若CX=0,或者ZF=1,則退出循環,執行LOOP的下一條指令。
- 舉例:在長度爲M的字符串SYMBOL中查找大寫字母A,在找到之後將其變爲小寫。
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