Jcc

如果条件已满足则跳转

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
77 cbJA rel8D有效有效如果跳到以上(CF=0和ZF=0)则跳得短.
73 cbJAE rel8D有效有效如果跳到以上或等于(CF=0),则跳得短。
72 cbJB rel8D有效有效如低于(CF=1),则跳得短。
76 cbJBE rel8D有效有效如果低于或等于(CF=1或ZF=1),则跳得短.
72 cbJC rel8D有效有效携带时跳得短(CF=1).
E3 cbJCXZ rel8D不可编码有效如果 CX 寄存器为 0 , 则跳过短处 。
E3 cbJECXZ rel8D有效有效如果 ECX 寄存器为 0, 则跳过短处 。
E3 cbJRCXZ rel8D有效不可编码如果 RCX 寄存器为 0, 则跳过短处 。
74 cbJE rel8D有效有效如果等于( ZF=1) 则跳得短 。
7F cbJG rel8D有效有效如果较大则跳得短( ZF=0, SF=OF) 。
7D cbJGE rel8D有效有效如果大于或等于(SF=OF),则跳过短处。
7C cbJL rel8D有效有效如果跳得少则跳得短( SF OF) 。
7E cbJLE rel8D有效有效如果小于或等于(ZF=1或SF OF),则跳得短。
76 cbJNA rel8D有效有效如果跳得不高,则跳得短(CF=1或ZF=1).
72 cbJNAE rel8D有效有效如果跳得不高或相等,则跳得短(CF=1).
73 cbJNB rel8D有效有效如果跳到下面,则跳得短(CF=0).
77 cbJNBE rel8D有效有效跳跃如果不低于或等于(CF=0和ZF=0)
73 cbJNC rel8D有效有效如果不携带,则跳得短(CF=0).
75 cbJNE rel8D有效有效跳过短或不等于( ZF=0) 。
7E cbJNG rel8D有效有效如果跳得不大, 则跳得短( ZF=1 或 SF OF) 。
7C cbJNGE rel8D有效有效如果跳得不高或相等,则跳得短。
7D cbJNL rel8D有效有效跳过( SF = OF) 。
7F cbJNLE rel8D有效有效跳转短( ZF=0, SF=OF) 。
71 cbJNO rel8D有效有效如不溢出,跳跃短(OF=0).
7B cbJNP rel8D有效有效跳跃短( 如果不是等值的话) (PF=0) 。
79 cbJNS rel8D有效有效如果未签名, 则跳转短( SF=0) 。
75 cbJNZ rel8D有效有效跳过短( 如果不是零) (ZF=0) 。
70 cbJO rel8D有效有效如果溢出则跳得短( OF=1) 。
7A cbJP rel8D有效有效如果对等则跳得短(PF=1).
7A cbJPE rel8D有效有效如果偶数跳得短( PF=1) 。
7B cbJPO rel8D有效有效如果偶数( PF = 0) , 则跳得短 。
78 cbJS rel8D有效有效如果符号跳过( SF=1) 。
74 cbJZ rel8D有效有效如果零则跳得短( ZF = 1).
0F 87 cwJA rel16D不支持有效如果上方跳跃( CF=0 和 ZF=0),则不支持64位模式 。
0F 87 cdJA rel32D有效有效如上跳则跳近(CF=0和ZF=0).
0F 83 cwJAE rel16D不支持有效如果上方或等值( CF=0) 跳转到附近, 不支持64位模式 。
0F 83 cdJAE rel32D有效有效跳到上方或等值处( CF=0) 。
0F 82 cwJB rel16D不支持有效如果在下方跳跃( CF=1),则不支持64位模式 。
0F 82 cdJB rel32D有效有效跳到下方( CF=1) 。
0F 86 cwJBE rel16D不支持有效如果低于或等于(CF=1或ZF=1),则跳转到附近。
0F 86 cdJBE rel32D有效有效如果低于或等于(CF=1或ZF=1),则跳近。
0F 82 cwJC rel16D不支持有效如果携带( CF=1) , 跳转到附近 。 不支持 64 位模式 。
0F 82 cdJC rel32D有效有效如果携带(CF=1),则跳近点。
0F 84 cwJE rel16D不支持有效如果等于( ZF=1) , 则跳转到附近 。 在 64 位模式中不支持 。
0F 84 cdJE rel32D有效有效如果等于( ZF=1) , 则跳到附近 。
0F 84 cwJZ rel16D不支持有效如果 0 (ZF=1) 跳近, 不支持64位模式 。
0F 84 cdJZ rel32D有效有效跳近 0 (ZF=1) 。
0F 8F cwJG rel16D不支持有效如果更大, 则跳近( ZF=0 和 SF= OF) 。 不支持64 位模式 。
0F 8F cdJG rel32D有效有效跳近( ZF=0, SF=OF) 。
0F 8D cwJGE rel16D不支持有效如果大于或等于( SF=OF) , 跳转到附近。 不支持64位模式 。
0F 8D cdJGE rel32D有效有效如果大于或等于(SF=OF),则跳近。
0F 8C cwJL rel16D不支持有效跳转到小于( SF OF) 。 不支持 64 位模式 。
0F 8C cdJL rel32D有效有效跳近( SF OF) 。
0F 8E cwJLE rel16D不支持有效如果小于或等于(ZF=1或SF OF),则跳转到附近。不支持64位模式。
0F 8E cdJLE rel32D有效有效如果小于或等于( ZF=1 或 SF OF) , 则跳近 。
0F 86 cwJNA rel16D不支持有效如果不是上方( CF=1 或 ZF=1 ),则跳转到附近。 不支持64位模式 。
0F 86 cdJNA rel32D有效有效跳近( 如果不是以上的话) (CF=1 或 ZF= 1) 。
0F 82 cwJNAE rel16D不支持有效跳转到上方或相等处( CF=1), 不支持64位模式 。
0F 82 cdJNAE rel32D有效有效跳近( 如果不是上方或等于) (CF=1) 。
0F 83 cwJNB rel16D不支持有效在64位模式下不支持的跳转到( CF=0) 。
0F 83 cdJNB rel32D有效有效跳近或低于(CF=0)
0F 87 cwJNBE rel16D不支持有效跳转到接近或等于(CF=0和ZF=0),不支持64位模式.
0F 87 cdJNBE rel32D有效有效跳跃接近或等于(CF=0和ZF=0)。
0F 83 cwJNC rel16D不支持有效如果不携带( CF=0) , 则跳转到附近 。 不支持 64 位模式 。
0F 83 cdJNC rel32D有效有效如不携带则跳近(CF=0).
0F 85 cwJNE rel16D不支持有效跳近或不等于( ZF=0) 不支持64位模式 。
0F 85 cdJNE rel32D有效有效跳近( ZF=0) 。
0F 8E cwJNG rel16D不支持有效跳近( 如果不是更大的话) (ZF=1 或 SF OF) 。 不支持64位模式 。
0F 8E cdJNG rel32D有效有效跳近( ZF=1 或 SF OF) 。
0F 8C cwJNGE rel16D不支持有效跳转到( SF OF) 。 不支持 64 位模式 。
0F 8C cdJNGE rel32D有效有效跳近( 如果不是更大或相等) 。
0F 8D cwJNL rel16D不支持有效跳近( SF=OF) 。 不支持64位模式 。
0F 8D cdJNL rel32D有效有效跳近( SF = OF) 。
0F 8F cwJNLE rel16D不支持有效跳转到不小于或等于( ZF=0 和 SF=OF) 。 不支持64位模式 。
0F 8F cdJNLE rel32D有效有效跳近( ZF=0, SF=OF) 。
0F 81 cwJNO rel16D不支持有效如果不是溢出, 则跳转到附近( OF=0) 。 不支持64位模式 。
0F 81 cdJNO rel32D有效有效如果不是溢出,则跳近(OF=0)
0F 8B cwJNP rel16D不支持有效跳转到接近( 如果不是等值( PF=0) ) 。 不支持64 位模式 。
0F 8B cdJNP rel32D有效有效跳跃接近( 如果不是) 等值( PF = 0) 。
0F 89 cwJNS rel16D不支持有效如果不是签名, 跳转到附近 (SF=0), 不支持64位模式 。
0F 89 cdJNS rel32D有效有效跳转到( SF=0) 如果不是签名, 则跳到附近 。
0F 85 cwJNZ rel16D不支持有效跳近( 如果不是0 ) (ZF=0 ), 不支持64位模式 。
0F 85 cdJNZ rel32D有效有效跳到零( ZF=0) 附近
0F 80 cwJO rel16D不支持有效如果溢出则跳近( OF=1), 不支持64位模式 。
0F 80 cdJO rel32D有效有效如果溢出则跳近( OF=1) 。
0F 8A cwJP rel16D不支持有效如果等价( PF=1) , 跳转到附近, 不支持 64 位模式 。
0F 8A cdJP rel32D有效有效如果对等则跳近( PF = 1) 。
0F 8A cwJPE rel16D不支持有效如果偶数( PF=1) , 跳转到附近, 不支持64位模式 。
0F 8A cdJPE rel32D有效有效如果偶数跳近( PF=1) 。
0F 8B cwJPO rel16D不支持有效如果平方奇数( PF=0) , 则跳近 。 不支持64 位模式 。
0F 8B cdJPO rel32D有效有效如果偶数( PF = 0) , 则跳近 。
0F 88 cwJS rel16D不支持有效跳近如果符号( SF=1) 。 不支持64位模式 。
0F 88 cdJS rel32D有效有效如果符号跳近( SF = 1) 。
0F 84 cwJZ rel16D不支持有效如果 0 (ZF=1) 跳近, 不支持64位模式 。
0F 84 cdJZ rel32D有效有效跳近 0 (ZF=1) 。

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

D

  1. offset操作码后的位移

实测开销

正在从 arch-data 加载实测数据...

说明

检查EFLAGS登记册(CF,OF,PF,SF,和ZF)中一个或多个状态标志的状态,如果旗帜处于指定的状态(条件),则跳转到目标操作数指定的目标指令. 每个指令都附有一个条件代码(cc),以说明所测试的条件。 如果条件不能满足,则跳跃不进行,执行继续遵循Jcc指令的指示.

目标指令以相对偏移(与EIP登记册中的指令指针的当前值相对的签名偏移)来指定. 相对偏移(rel8,rel16,或rel32)在组装代码中一般被指定为标签,但在机器代码级别上,它被编码为签名,8位或32位的即时值,该值被添加到指令指针中. 指令编码对128至+127的抵消效率最高. 如果 操作数 大小属性为 16,则EIP 寄存器的上两个字节被清除,导致 指令指针 最大大小为 16 比特.

每个Jcc元音的条件在上页表格的"描述"栏中给出. 比较有符号整数时使用"小"和"大"两个词,比较无符号整数时使用"以上"和"以下"两个词.

由于状态标志的特定状态有时可以有两种解释,因此对一些操作码定义了两种mnemonics. 例如,JA(如果以上跳动)指令和JNBE(如果不低于或等于跳动)指令是操作码 77H的交替模式.

Jcc指令不支持远跳(跳转到其他代码段). 当有条件跳跃的目标处于不同的段位时,使用与Jcc指令测试的条件相反的条件,然后以无条件的远跳(JMP指令)进入另一个段位. 例如,以下有条件的远跳是非法的:

JZ FARLABEL;

要完成这一远处的跳跃,请使用以下两个指令: 1. (二) JNZ BEYOND; (二) JMP FARLABEL; BEYOND : (英语).

JRCXZ,JECXZ,和JCXZ指令与其他Jcc指令不同,因为它们不检查状态标志. 相反,他们检查RCX,ECX或CX为0. 选中的寄存器由地址大小属性决定 。 这些指令在以有条件的循环指令(如LOOPNE)终止的循环开头使用时有用. 它们可用于防止一个指令序列在RCX,ECX或CX为0时进入循环. 这将导致循环执行264,232或64K倍(而不是零倍).

所有有条件的跳转都转换为一两条缓存行的代码获取,无论跳转地址或缓存性如何.

在64位模式下,操作数大小固定在64位. JMP Short是RIP = RIP + 8位偏移符号扩展为64位. JMP Near is RIP = RIP + 32位偏移符号扩展为64位.

行动

IF condition
    THEN
          tempEIP := EIP + SignExtend(DEST);
          IF OperandSize = 16
                THEN tempEIP := tempEIP AND 0000FFFFH;
          FI;
    IF tempEIP is not within code segment limit
          THEN #GP(0);
          ELSE EIP := tempEIP
    FI;

FI;

受影响的旗帜

None.

异常

保护模式
#GP(0)如果冲抵跳跃到CS部分的极限之外.
#UD如果使用 LOCK 前缀 。
实地址模式
#GP如果跳转到 CS 段的界限以外, 或者在 0 到 FFFFH 的有效地址空间之外, 如果使用 32 位地址大小覆盖前缀, 则会发生此条件 。
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
与真实地址模式相同的例外 。
兼容模式
与保护模式中的例外相同.
64 位模式
#GP(0)如果内存地址是非冠状的.
#UD如果使用 LOCK 前缀 。

来源