彙編之分支程序設計
1. 條件轉移指令
1.1 無條件轉移指令
- 格式:
JMP label
- 功能:JMP 指令無條件跳轉到目標地址,該地址用代碼標號(label)來標識,並被彙編器轉換爲偏移量。
- 說明:當 CPU 執行一個無條件轉移時,目標地址的偏移量被送入指令指針寄存器,從而導致邁從新地址開始繼續執行。
1.2 條件轉移指令
- 格式:
Jcc label
- 功能:指定的條件cc如果成立,程序轉移到由標號label指定的目標地址去執行指令;條件不成立,則程序將順序執行下一條指令。
- 說明:
(1)操作數label是採用段內短轉移;
(2)Jcc指令不影響標誌,但要利用標誌。 - Jcc指令的分類:根據利用的標誌位不同,16條指令分成3種情況。
(1)判斷單個標誌位狀態
(2)比較無符號數高低
(3)比較有符號數大小
1.2.1 判斷單個標誌位狀態
這組指令單獨判斷5個狀態標誌之一:
-
JZ/JE和JNZ/JNE:利用零標誌ZF,判斷結果是否爲零(或相等)。 JZ/JE表示結果爲零(或相等),則轉移。
-
JS和JNS:利用符號標誌SF,判斷結果是正是負, JS表示結果爲負則轉移。
-
JO和JNO:利用溢出標誌OF,判斷結果是否產生溢出, JO表示溢出則轉移。
-
JP/JPE和JNP/JPO:利用奇偶標誌PF,判斷結果中“1”的個數是偶是奇。JP表示偶個數個1。
-
JC和JNC:利用進位標誌CF,判斷結果是否進位或借位。進位或借位爲1則轉移。
助記符 | 說明 | 標誌位/寄存器 | 助記符 | 說明 | 標誌位/寄存器 |
---|---|---|---|---|---|
JZ | 爲零跳轉 | ZF=1 | JNO | 無溢出跳轉 | OF=0 |
JNZ | 非零跳轉 | ZF=0 | JS | 有符號跳轉 | SF=1 |
JC | 進位跳轉 | CF=1 | JNS | 無符號跳轉 | SF=0 |
JNC | 無進位跳轉 | CF=0 | JP | 偶校驗跳轉 | PF=1 |
JO | 溢出跳轉 | OF=1 | JNP | 奇校驗跳轉 | PF=0 |
1.2.2 比較無符號數高低
無符號數高低有4種關係:
- 高於(不低於等於):JA 和JNBE
- 高於等於(不低於):JAE 和JNB
- 低於(不高於等於):JB和JNAE
- 低於等於(不高於):JBE和JNA
助記符 | 說明 | 助記符 | 說明 |
---|---|---|---|
JA | 大於跳轉(若 leftOp > rightOp) | JB | 小於跳轉(若 leftOp < rightOp) |
JNBE | 不小於或等於跳轉(與 JA 相同) | JNAE | 不大於或等於跳轉(與 JB 相同) |
JAE | 大於或等於跳轉(若 leftOp ≥ rightOp) | JBE | 小於或等於跳轉(若 leftOp ≤ rightOp) |
JNB | 不小於跳轉(與 JAE 相同) | JNA | 不大於跳轉(與 JBE 相同) |
1.2.3 比較有符號數大小
兩數的大小分成4種關係:
- 大於(不小於等於):JG和JNLE
- 大於等於(不小於):JGE和JNL
- 小於(不大於等於):JL和JNGE
- 小於等於(不大於):JLE和JNG
助記符 | 說明 | 助記符 | 說明 |
---|---|---|---|
JG | 大於跳轉(若 leftOp > rightOp) | JL | 小於跳轉(若 leftOp < rightOp) |
JNLE | 不小於或等於跳轉(與 JG 相同) | JNGE | 不大於或等於跳轉(與 JL 相同) |
JGE | 大於或等於跳轉(若 leftOp ≥ rightOp) | JLE | 小於或等於跳轉(若 leftOp ≤ rightOp) |
JNL | 不小於跳轉(與 JGE 相同) | JNG | 不大於跳轉(與 JLE 相同) |
2. 分支程序設計
- 分支程序根據條件是真或假決定執行與否,判斷的條件是各種指令,如CMP、TEST等執行後形成的狀態標誌與條件轉移指令Jcc聯合可以實現分支控制。用無條件轉移指令JMP也可以實現分支控制。
2.1 單重分支
- 條件成立跳轉到標號所在的指令執行,否則順序執行分支語句體。
- 注意:選擇正確的條件轉移指令和轉移目標地址。
- 舉例:編程求|X-Y|,結果存於RESULT單元中,設X和Y都爲16位數。
DATA SEGMENT
X DW -10
Y DW 20
RESULT DW?
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,X
SUB AX,Y
JNS NONNEG
NEG AX
NONNEG:
MOV RESULT,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
2 .2 雙分支
- 條件成立跳轉執行第2個分支語句體,否則順序執行第1個分支語句體。
- 注意第1個分支體後一定要有一個JMP指令跳到第2個分支體後。
- 舉例:編寫計算下面函數值的程序:
Y=1,X>=0;
Y=-1,X<0;
設輸入數據爲X、輸出數據Y,且皆爲字節變量。
DATA SEGMENT
X DB -10
Y DB ?
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
CMP X,0
JGE A
MOV Y,-1
JMP EXIT
A: MOV Y,1
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START