操作碼 |
指令 |
說明 |
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 暫存器中指令指針目前值的有符號偏移量)指定。在彙編程式碼中,相對偏移量(rel8、rel16 或 rel32)通常指定為標籤,但是在機器程式碼級別,它的編碼形式是有符號的 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 位地址大小覆蓋字首,則可能會發生這種情況。
#GP(0) - 如果跳轉目標的偏移量超出 CS 段的限制,或是出現在 0 到 FFFFH 的有效地址空間之外。如果使用 32 位地址大小覆蓋字首,則可能會發生這種情況。