17 KiB
Executable File
Jcc — Jump if Condition Is Met
Description
Checks the state of one or more of the status flags in the EFLAGS register (CF, OF, PF, SF, and ZF) and, if the flags are in the specified state (condition), performs a jump to the target instruction specified by the destination operand. A condition code (cc) is associated with each instruction to indicate the condition being tested for. If the condition is not satisfied, the jump is not performed and execution continues with the instruction following the Jcc instruction.
Instruction
| Opcode | Assembly | Op/En | Modern Mode | Legacy Mode | Description |
|---|---|---|---|---|---|
| 77 cb | JA rel8 | D | Valid | Valid | Jump short if above (CF=0 and ZF=0). |
| 73 cb | JAE rel8 | D | Valid | Valid | Jump short if above or equal (CF=0). |
| 72 cb | JB rel8 | D | Valid | Valid | Jump short if below (CF=1). |
| 76 cb | JBE rel8 | D | Valid | Valid | Jump short if below or equal (CF=1 or ZF=1). |
| 72 cb | JC rel8 | D | Valid | Valid | Jump short if carry (CF=1). |
| E3 cb | JCXZ rel8 | D | N.E. | Valid | Jump short if CX register is 0. |
| E3 cb | JECXZ rel8 | D | Valid | Valid | Jump short if ECX register is 0. |
| E3 cb | JRCXZ rel8 | D | Valid | N.E. | Jump short if RCX register is 0. |
| 74 cb | JE rel8 | D | Valid | Valid | Jump short if equal (ZF=1). |
| 7F cb | JG rel8 | D | Valid | Valid | Jump short if greater (ZF=0 and SF=OF). |
| 7D cb | JGE rel8 | D | Valid | Valid | Jump short if greater or equal (SF=OF). |
| 7C cb | JL rel8 | D | Valid | Valid | Jump short if less (SF≠ OF). |
| 7E cb | JLE rel8 | D | Valid | Valid | Jump short if less or equal (ZF=1 or SF≠ OF). |
| 76 cb | JNA rel8 | D | Valid | Valid | Jump short if not above (CF=1 or ZF=1). |
| 72 cb | JNAE rel8 | D | Valid | Valid | Jump short if not above or equal (CF=1). |
| 73 cb | JNB rel8 | D | Valid | Valid | Jump short if not below (CF=0). |
| 77 cb | JNBE rel8 | D | Valid | Valid | Jump short if not below or equal (CF=0 and ZF=0). |
| 73 cb | JNC rel8 | D | Valid | Valid | Jump short if not carry (CF=0). |
| 75 cb | JNE rel8 | D | Valid | Valid | Jump short if not equal (ZF=0). |
| 7E cb | JNG rel8 | D | Valid | Valid | Jump short if not greater (ZF=1 or SF≠ OF). |
| 7C cb | JNGE rel8 | D | Valid | Valid | Jump short if not greater or equal (SF≠ OF). |
| 7D cb | JNL rel8 | D | Valid | Valid | Jump short if not less (SF=OF). |
| 7F cb | JNLE rel8 | D | Valid | Valid | Jump short if not less or equal (ZF=0 and SF=OF). |
| 71 cb | JNO rel8 | D | Valid | Valid | Jump short if not overflow (OF=0). |
| 7B cb | JNP rel8 | D | Valid | Valid | Jump short if not parity (PF=0). |
| 79 cb | JNS rel8 | D | Valid | Valid | Jump short if not sign (SF=0). |
| 75 cb | JNZ rel8 | D | Valid | Valid | Jump short if not zero (ZF=0). |
| 70 cb | JO rel8 | D | Valid | Valid | Jump short if overflow (OF=1). |
| 7A cb | JP rel8 | D | Valid | Valid | Jump short if parity (PF=1). |
| 7A cb | JPE rel8 | D | Valid | Valid | Jump short if parity even (PF=1). |
| 7B cb | JPO rel8 | D | Valid | Valid | Jump short if parity odd (PF=0). |
| 78 cb | JS rel8 | D | Valid | Valid | Jump short if sign (SF=1). |
| 74 cb | JZ rel8 | D | Valid | Valid | Jump short if zero (ZF = 1). |
| 0F 87 cw | JA rel16 | D | N.S. | Valid | Jump near if above (CF=0 and ZF=0). |
| 0F 87 cd | JA rel32 | D | Valid | Valid | Jump near if above (CF=0 and ZF=0). |
| 0F 83 cw | JAE rel16 | D | N.S. | Valid | Jump near if above or equal (CF=0). |
| 0F 83 cd | JAE rel32 | D | Valid | Valid | Jump near if above or equal (CF=0). |
| 0F 82 cw | JB rel16 | D | N.S. | Valid | Jump near if below (CF=1). |
| 0F 82 cd | JB rel32 | D | Valid | Valid | Jump near if below (CF=1). |
| 0F 86 cw | JBE rel16 | D | N.S. | Valid | Jump near if below or equal (CF=1 or ZF=1). |
| 0F 86 cd | JBE rel32 | D | Valid | Valid | Jump near if below or equal (CF=1 or ZF=1). |
| 0F 82 cw | JC rel16 | D | N.S. | Valid | Jump near if carry (CF=1). |
| 0F 82 cd | JC rel32 | D | Valid | Valid | Jump near if carry (CF=1). |
| 0F 84 cw | JE rel16 | D | N.S. | Valid | Jump near if equal (ZF=1). |
| 0F 84 cd | JE rel32 | D | Valid | Valid | Jump near if equal (ZF=1). |
| 0F 84 cw | JZ rel16 | D | N.S. | Valid | Jump near if 0 (ZF=1). |
| 0F 84 cd | JZ rel32 | D | Valid | Valid | Jump near if 0 (ZF=1). |
| 0F 8F cw | JG rel16 | D | N.S. | Valid | Jump near if greater (ZF=0 and SF=OF). |
| 0F 8F cd | JG rel32 | D | Valid | Valid | Jump near if greater (ZF=0 and SF=OF). |
| 0F 8D cw | JGE rel16 | D | N.S. | Valid | Jump near if greater or equal (SF=OF). |
| 0F 8D cd | JGE rel32 | D | Valid | Valid | Jump near if greater or equal (SF=OF). |
| 0F 8C cw | JL rel16 | D | N.S. | Valid | Jump near if less (SF≠ OF). |
| 0F 8C cd | JL rel32 | D | Valid | Valid | Jump near if less (SF≠ OF). |
| 0F 8E cw | JLE rel16 | D | N.S. | Valid | Jump near if less or equal (ZF=1 or SF≠ OF). |
| 0F 8E cd | JLE rel32 | D | Valid | Valid | Jump near if less or equal (ZF=1 or SF≠ OF). |
| 0F 86 cw | JNA rel16 | D | N.S. | Valid | Jump near if not above (CF=1 or ZF=1). |
| 0F 86 cd | JNA rel32 | D | Valid | Valid | Jump near if not above (CF=1 or ZF=1). |
| 0F 82 cw | JNAE rel16 | D | N.S. | Valid | Jump near if not above or equal (CF=1). |
| 0F 82 cd | JNAE rel32 | D | Valid | Valid | Jump near if not above or equal (CF=1). |
| 0F 83 cw | JNB rel16 | D | N.S. | Valid | Jump near if not below (CF=0). |
| 0F 83 cd | JNB rel32 | D | Valid | Valid | Jump near if not below (CF=0). |
| 0F 87 cw | JNBE rel16 | D | N.S. | Valid | Jump near if not below or equal (CF=0 and ZF=0). |
| 0F 87 cd | JNBE rel32 | D | Valid | Valid | Jump near if not below or equal (CF=0 and ZF=0). |
| 0F 83 cw | JNC rel16 | D | N.S. | Valid | Jump near if not carry (CF=0). |
| 0F 83 cd | JNC rel32 | D | Valid | Valid | Jump near if not carry (CF=0). |
| 0F 85 cw | JNE rel16 | D | N.S. | Valid | Jump near if not equal (ZF=0). |
| 0F 85 cd | JNE rel32 | D | Valid | Valid | Jump near if not equal (ZF=0). |
| 0F 8E cw | JNG rel16 | D | N.S. | Valid | Jump near if not greater (ZF=1 or SF≠ OF). |
| 0F 8E cd | JNG rel32 | D | Valid | Valid | Jump near if not greater (ZF=1 or SF≠ OF). |
| 0F 8C cw | JNGE rel16 | D | N.S. | Valid | Jump near if not greater or equal (SF≠ OF). |
| 0F 8C cd | JNGE rel32 | D | Valid | Valid | Jump near if not greater or equal (SF≠ OF). |
| 0F 8D cw | JNL rel16 | D | N.S. | Valid | Jump near if not less (SF=OF). |
| 0F 8D cd | JNL rel32 | D | Valid | Valid | Jump near if not less (SF=OF). |
| 0F 8F cw | JNLE rel16 | D | N.S. | Valid | Jump near if not less or equal (ZF=0 and SF=OF). |
| 0F 8F cd | JNLE rel32 | D | Valid | Valid | Jump near if not less or equal (ZF=0 and SF=OF). |
| 0F 81 cw | JNO rel16 | D | N.S. | Valid | Jump near if not overflow (OF=0). |
| 0F 81 cd | JNO rel32 | D | Valid | Valid | Jump near if not overflow (OF=0). |
| 0F 8B cw | JNP rel16 | D | N.S. | Valid | Jump near if not parity (PF=0). |
| 0F 8B cd | JNP rel32 | D | Valid | Valid | Jump near if not parity (PF=0). |
| 0F 89 cw | JNS rel16 | D | N.S. | Valid | Jump near if not sign (SF=0). |
| 0F 89 cd | JNS rel32 | D | Valid | Valid | Jump near if not sign (SF=0). |
| 0F 85 cw | JNZ rel16 | D | N.S. | Valid | Jump near if not zero (ZF=0). |
| 0F 85 cd | JNZ rel32 | D | Valid | Valid | Jump near if not zero (ZF=0). |
| 0F 80 cw | JO rel16 | D | N.S. | Valid | Jump near if overflow (OF=1). |
| 0F 80 cd | JO rel32 | D | Valid | Valid | Jump near if overflow (OF=1). |
| 0F 8A cw | JP rel16 | D | N.S. | Valid | Jump near if parity (PF=1). |
| 0F 8A cd | JP rel32 | D | Valid | Valid | Jump near if parity (PF=1) |
| 0F 8A cw | JPE rel16 | D | N.S. | Valid | Jump near if parity even (PF=1). |
| 0F 8A cd | JPE rel32 | D | Valid | Valid | Jump near if parity even (PF=1). |
| 0F 8B cw | JPO rel16 | D | N.S. | Valid | Jump near if parity odd (PF=0). |
| 0F 8B cd | JPO rel32 | D | Valid | Valid | Jump near if parity odd (PF=0). |
| 0F 88 cw | JS rel16 | D | N.S. | Valid | Jump near if sign (SF=1). |
| 0F 88 cd | JS rel32 | D | Valid | Valid | Jump near if sign (SF=1). |
| 0F 84 cw | JZ rel16 | D | N.S. | Valid | Jump near if 0 (ZF=1). |
| 0F 84 cd | JZ rel32 | D | Valid | Valid | Jump near if 0 (ZF=1). |
Information
The target instruction is specified with a relative offset (a signed offset relative to the current value of the instruction pointer in the EIP register). A relative offset (rel8, rel16, or rel32) is generally specified as a label in assembly code, but at the machine code level, it is encoded as a signed, 8-bit or 32-bit immediate value, which is added to the instruction pointer. Instruction coding is most efficient for offsets of –128 to +127. If the operand-size attribute is 16, the upper two bytes of the EIP register are cleared, resulting in a maximum instruction pointer size of 16 bits. The conditions for each Jcc mnemonic are given in the “Description” column of the table on the preceding page. The terms “less” and “greater” are used for comparisons of signed integers and the terms “above” and “below” are used for unsigned integers.
Because a particular state of the status flags can sometimes be interpreted in two ways, two mnemonics are defined for some opcodes. For example, the JA (jump if above) instruction and the JNBE (jump if not below or equal) instruction are alternate mnemonics for the opcode 77H.
The Jcc instruction does not support far jumps (jumps to other code segments). When the target for the conditional jump is in a different segment, use the opposite condition from the condition being tested for the Jcc instruction, and then access the target with an unconditional far jump (JMP instruction) to the other segment. For example, the following conditional far jump is illegal:
JZ FARLABEL;
To accomplish this far jump, use the following two instructions:
JNZ BEYOND;
JMP FARLABEL;
BEYOND:
The JRCXZ, JECXZ and JCXZ instructions differ from other Jcc instructions because they do not check status flags. Instead, they check RCX, ECX or CX for 0. The register checked is determined by the address-size attribute. These instructions are useful when used at the beginning of a loop that terminates with a conditional loop instruction (such as LOOPNE). They can be used to prevent an instruction sequence from entering a loop when RCX, ECX or CX is 0. This would cause the loop to execute 264, 2 32 or 64K times (not zero times).
All conditional jumps are converted to code fetches of one or two cache lines, regardless of jump address or cache-ability.
In 64-bit mode, operand size is fixed at 64 bits. JMP Short is RIP = RIP + 8-bit offset sign extended to 64 bits. JMP Near is RIP = RIP + 32-bit offset sign extended to 64-bits.