Jcc - 滿足條件時跳轉

操作碼

指令

說明

77 cb

JA rel8

高於(CF=0 且 ZF=0)時短跳轉

73 cb

JAE rel8

高於或等於 (CF=0) 時短跳轉

72 cb

JB rel8

低於 (CF=1) 時短跳轉

76 cb

JBE rel8

低於或等於(CF=1 或 ZF=1)時短跳轉

72 cb

JC rel8

進位 (CF=1) 時短跳轉

E3 cb

JCXZ rel8

CX 暫存器為 0 時短跳轉

E3 cb

JECXZ rel8

ECX 暫存器為 0 時短跳轉

74 cb

JE rel8

等於 (ZF=1) 時短跳轉

7F cb

JG rel8

大於(ZF=0 且 SF=OF)時短跳轉

7D cb

JGE rel8

大於或等於 (SF=OF) 時短跳轉

7C cb

JL rel8

小於 (SF<>OF) 時短跳轉

7E cb

JLE rel8

小於或等於(ZF=1 或 SF<>OF)時短跳轉

76 cb

JNA rel8

不高於(CF=1 或 ZF=1)時短跳轉

72 cb

JNAE rel8

不高於或等於 (CF=1) 時短跳轉

73 cb

JNB rel8

不低於 (CF=0) 時短跳轉

77 cb

JNBE rel8

不低於或等於(CF=0 或 ZF=0)時短跳轉

73 cb

JNC rel8

無進位 (CF=0) 時短跳轉

75 cb

JNE rel8

不相等 (ZF=0) 時短跳轉

7E cb

JNG rel8

不大於(ZF=1 或 SF<>OF)時短跳轉

7C cb

JNGE rel8

不大於或等於 (SF<>OF) 時短跳轉

7D cb

JNL rel8

不小於 (SF=OF) 時短跳轉

7F cb

JNLE rel8

不小於或等於(ZF=0 且 SF=OF)時短跳轉

71 cb

JNO rel8

不上溢 (OF=0) 時短跳轉

7B cb

JNP rel8

奇校驗 (PF=0) 時短跳轉

79 cb

JNS rel8

正數時 (SF=0) 短跳轉

75 cb

JNZ rel8

不為零 (ZF=0) 時短跳轉

70 cb

JO rel8

上溢 (OF=1) 時短跳轉

7A cb

JP rel8

偶校驗 (PF=1) 時短跳轉

7A cb

JPE rel8

偶校驗 (PF=1) 時短跳轉

7B cb

JPO rel8

奇校驗 (PF=0) 時短跳轉

78 cb

JS rel8

負數 (SF=1) 時短跳轉

74 cb

JZ rel8

為零 (ZF 1) 時短跳轉

0F 87 cw/cd

JA rel16/32

高於(CF=0 且 ZF=0)時近跳轉

0F 83 cw/cd

JAE rel16/32

高於或等於 (CF=0) 時近跳轉

0F 82 cw/cd

JB rel16/32

低於 (CF=1) 時近跳轉

0F 86 cw/cd

JBE rel16/32

低於或等於(CF=1 或 ZF=1)時近跳轉

0F 82 cw/cd

JC rel16/32

進位 (CF=1) 時近跳轉

0F 84 cw/cd

JE rel16/32

相等 (ZF=1) 時近跳轉

0F 84 cw/cd

JZ rel16/32

為 0 (ZF=1) 時近跳轉

0F 8F cw/cd

JG rel16/32

大於(ZF=0 且 SF=OF)時近跳轉

操作碼

指令

說明

0F 8D cw/cd

JGE rel16/32

大於或等於 (SF=OF) 時近跳轉

0F 8C cw/cd

JL rel16/32

小於 (SF<>OF) 時近跳轉

0F 8E cw/cd

JLE rel16/32

小於或等於(ZF=1 或 SF<>OF)時近跳轉

0F 86 cw/cd

JNA rel16/32

不高於(CF=1 或 ZF=1)時近跳轉

0F 82 cw/cd

JNAE rel16/32

不高於或等於 (CF=1) 時近跳轉

0F 83 cw/cd

JNB rel16/32

不低於 (CF=0) 時近跳轉

0F 87 cw/cd

JNBE rel16/32

不低於或等於(CF=0 或 ZF=0)時近跳轉

0F 83 cw/cd

JNC rel16/32

無進位 (CF=0) 時近跳轉

0F 85 cw/cd

JNE rel16/32

不相等 (ZF=0) 時近跳轉

0F 8E cw/cd

JNG rel16/32

不大於(ZF=1 或 SF<>OF)時近跳轉

0F 8C cw/cd

JNGE rel16/32

不大於或等於 (SF<>OF) 時近跳轉

0F 8D cw/cd

JNL rel16/32

不小於 (SF=OF) 時近跳轉

0F 8F cw/cd

JNLE rel16/32

不小於或等於(ZF=0 且 SF=OF)時近跳轉

0F 81 cw/cd

JNO rel16/32

不上溢 (OF=0) 時近跳轉

0F 8B cw/cd

JNP rel16/32

奇校驗 (PF=0) 時近跳轉

0F 89 cw/cd

JNS rel16/32

正數 (SF=0) 時近跳轉

0F 85 cw/cd

JNZ rel16/32

不為零 (ZF=0) 時近跳轉

0F 80 cw/cd

JO rel16/32

上溢 (OF=1) 時近跳轉

0F 8A cw/cd

JP rel16/32

偶校驗 (PF=1) 時近跳轉

0F 8A cw/cd

JPE rel16/32

偶校驗 (PF=1) 時近跳轉

0F 8B cw/cd

JPO rel16/32

奇校驗 (PF=0) 時近跳轉

0F 88 cw/cd

JS rel16/32

負數 (SF=1) 時近跳轉

0F 84 cw/cd

JZ rel16/32

為 0 (ZF=1) 時近跳轉

說明

檢查 EFLAGS 暫存器中一個或多個狀態標誌(CF、OF、PF、SF 及 ZF)的狀態,如果標誌處於指定的狀態(條件),則跳轉到目標運算元指定的目標指令。條件程式碼 (cc) 與每條指令關聯,用於指明測試條件。如果條件不滿足,則不執行跳轉操作,而是繼續執行 Jcc 指令後面的指令。

目標指令使用相對偏移量(相對於 EIP 暫存器中指令指針目前值的有符號偏移量)指定。在彙編程式碼中,相對偏移量(rel8rel16rel32)通常指定為標籤,但是在機器程式碼級別,它的編碼形式是有符號的 8 位或 32 位立即數,並且會加到指令指針上。對於 -128 到 +127 的偏移量,指令編碼的效率最高。如果運算元大小的屬性為 16,EIP 暫存器的上面兩個位元組清 0,這樣就產生了 16 位的最大指令指針。

每個 Jcc 助記符的條件在上文表格的“說明”列中給出。術語“小於”與“大於”用於有符號整數的比較;術語“高於”與“低於”用於無符號整數。

由於狀態標誌的特定狀態有時存在兩種含義,因此給某些操作碼定義了兩個助記符。例如,JA(高於時跳轉)指令與 JNBE(低於或等於時跳轉)指令是操作碼 77H 的替代助記符。

Jcc 指令不支援遠跳轉(跳轉到其它程式碼段)。條件跳轉的目標在另一個段時,請使用 Jcc 指令的相反測試條件,然後使用無條件遠跳轉(JMP 指令)指令訪問該段。例如,下面的條件遠跳轉是非法的:

JZ FARLABEL;

要實現此遠跳轉,請使用以下兩條指令:

JNZ BEYOND;
JMP FARLABEL;
BEYOND:

JECXZ 與 JCXZ 指令不同於其它 Jcc 指令,它們不檢查狀態標誌。相反,它們分別檢查 ECX 與 CX 暫存器的內容是否為 0。CX 或 ECX 暫存器根據地址大小屬性選擇。在以條件循環指令(如 LOOPNE)終止的條件循環中,在開頭處使用這些指令非常有價值。它們可以避免在 ECX 或 CX 暫存器等於 0 時進入循環,否則將導致循環分別執行 232 或 64K 次,而不是零次。

所有的條件跳轉,不論跳轉地址在哪裡或能否快取,都會轉換成獲取一個或兩個快取線的程式碼。

操作

IF condition
THEN
EIP EIP + SignExtend(DEST);
IF OperandSize 16
THEN
EIP EIP AND 0000FFFFH;
FI;
FI;

影響的標誌

無。

保護模式異常

#GP(0) - 如果跳轉目標的偏移量超出 CS 段的限制。

實地址模式異常

#GP - 如果跳轉的目標偏移量超出 CS 段的限制,或是出現在 0 到 FFFFH 的有效地址空間之外。如果使用 32 位地址大小覆蓋字首,則可能會發生這種情況。

虛 8086 模式異常

#GP(0) - 如果跳轉目標的偏移量超出 CS 段的限制,或是出現在 0 到 FFFFH 的有效地址空間之外。如果使用 32 位地址大小覆蓋字首,則可能會發生這種情況。