彙編之分支程序設計

彙編之分支程序設計

1. 條件轉移指令

1.1 無條件轉移指令

  1. 格式:JMP label
  2. 功能:JMP 指令無條件跳轉到目標地址,該地址用代碼標號(label)來標識,並被彙編器轉換爲偏移量。
  3. 說明:當 CPU 執行一個無條件轉移時,目標地址的偏移量被送入指令指針寄存器,從而導致邁從新地址開始繼續執行。

1.2 條件轉移指令

  1. 格式:Jcc label
  2. 功能:指定的條件cc如果成立,程序轉移到由標號label指定的目標地址去執行指令;條件不成立,則程序將順序執行下一條指令。
  3. 說明:
    (1)操作數label是採用段內短轉移;
    (2)Jcc指令不影響標誌,但要利用標誌。
  4. Jcc指令的分類:根據利用的標誌位不同,16條指令分成3種情況。
    (1)判斷單個標誌位狀態
    (2)比較無符號數高低
    (3)比較有符號數大小

1.2.1 判斷單個標誌位狀態

這組指令單獨判斷5個狀態標誌之一:

  1. JZ/JE和JNZ/JNE:利用零標誌ZF,判斷結果是否爲零(或相等)。 JZ/JE表示結果爲零(或相等),則轉移。

  2. JS和JNS:利用符號標誌SF,判斷結果是正是負, JS表示結果爲負則轉移。

  3. JO和JNO:利用溢出標誌OF,判斷結果是否產生溢出, JO表示溢出則轉移。

  4. JP/JPE和JNP/JPO:利用奇偶標誌PF,判斷結果中“1”的個數是偶是奇。JP表示偶個數個1。

  5. 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種關係:

  1. 高於(不低於等於):JA 和JNBE
  2. 高於等於(不低於):JAE 和JNB
  3. 低於(不高於等於):JB和JNAE
  4. 低於等於(不高於):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種關係:

  1. 大於(不小於等於):JG和JNLE
  2. 大於等於(不小於):JGE和JNL
  3. 小於(不大於等於):JL和JNGE
  4. 小於等於(不大於):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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章