我会在这里做一个更广泛的答案。
在 x86 中,一般来说有两种类型的条件跳转:
算术跳转 - 如 JZ(如果为零则跳转)、JC(如果进位则跳转)、JNC(如果不进位则跳转)等。
比较跳跃 - JE(如果相等则跳跃)、JB(如果低于则跳跃)、JAE(如果高于或相等则跳跃)等。
因此,仅在算术或逻辑指令之后使用第一种类型:
sub eax, ebx
jnz .result_is_not_zero
and ecx, edx
jz .the_bit_is_not_set
仅在 CMP 指令后使用第二组:
cmp eax, ebx
jne .eax_is_not_equal_to_ebx
cmp ecx, edx
ja .ecx_is_above_than_edx
这样,程序变得更具可读性,您将永远不会感到困惑。
请注意,有时这些说明实际上是同义词。JZ == 乙脑;JC == JB; JNC == JAE 等等。完整的表格如下。如您所见,只有 16 个条件跳转指令,但有 30 个助记符 - 提供它们以允许创建更具可读性的源代码:
Mnemonic Condition tested Description
jo OF = 1 overflow
jno OF = 0 not overflow
jc, jb, jnae CF = 1 carry / below / not above nor equal
jnc, jae, jnb CF = 0 not carry / above or equal / not below
je, jz ZF = 1 equal / zero
jne, jnz ZF = 0 not equal / not zero
jbe, jna CF or ZF = 1 below or equal / not above
ja, jnbe CF and ZF = 0 above / not below or equal
js SF = 1 sign
jns SF = 0 not sign
jp, jpe PF = 1 parity / parity even
jnp, jpo PF = 0 not parity / parity odd
jl, jnge SF xor OF = 1 less / not greater nor equal
jge, jnl SF xor OF = 0 greater or equal / not less
jle, jng (SF xor OF) or ZF = 1 less or equal / not greater
jg, jnle (SF xor OF) or ZF = 0 greater / not less nor equal