Diferença entre JE / JNE e JZ / JNZ

88

No código assembly x86, são JEe JNEexatamente iguais a JZe JNZ?

QuasarDonkey
fonte
59
Resposta longa: sim.
Hans Passant
9
Resposta curta: não. (Mas eles correspondem exatamente ao mesmo código de máquina, então fazem exatamente a mesma coisa. Eles apenas têm mnemônicos diferentes para a mesma comparação.)
4
JE significa salto se igual, é igual se uma comparação anterior tiver o sinalizador z definido, JZ significa salto se o sinalizador z estiver definido. Eles são exatamente os mesmos, algumas pessoas querem pensar / escrever em termos de minha comparação era igual ou diferente. Algumas pessoas pensam e escrevem em termos de is the z flag set ou z flag clear.
old_timer

Respostas:

124

JEe JZsão apenas nomes diferentes para exatamente a mesma coisa: um salto condicional quando ZF(o sinalizador "zero") é igual a 1.

(Da mesma forma, JNEe JNZsão apenas nomes diferentes para um salto condicional quando ZFé igual a 0.)

Você pode usá-los de forma intercambiável, mas deve usá-los dependendo do que está fazendo:

  • JZ/ JNZsão mais apropriados quando você está testando explicitamente se algo é igual a zero:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEe JNEsão mais apropriados após uma CMPinstrução:

    cmp  edx, 42
    je   the_answer_is_42
    

    (Uma CMPinstrução realiza uma subtração e joga o valor do resultado fora, enquanto mantém os sinalizadores; é por isso que você obtém ZF=1quando os operandos são iguais e ZF=0quando não são.)

Matthew Slattery
fonte
2
TL: DR: mesma operação da máquina, significado semântico diferente . Assim como jb/ jc/ jnaetodos os testes CF = 1. Consulte felixcloutier.com/x86/jcc (ou cmovcc ou setcc)
Peter Cordes
36

No manual da Intel - Referência do conjunto de instruções , JEe JZtêm o mesmo opcode ( 74para rel8 / 0F 84para rel 16/32) JNEe JNZ( 75para rel8 / 0F 85para rel 16/32) compartilham opcodes.

JEe JZambos verificam o ZF(ou sinalizador zero), embora o manual seja um pouco diferente nas descrições do primeiro uso de rel8 JEe JZrel8 ZF, mas basicamente eles são os mesmos.

Aqui está um extrato das páginas 464, 465 e 467 do manual.

 Op Code    | mnemonic  | Description
 -----------|-----------|-----------------------------------------------  
 74 cb      | JE rel8   | Jump short if equal (ZF=1).
 74 cb      | JZ rel8   | Jump short if zero (ZF ← 1).

 0F 84 cw   | JE rel16  | Jump near if equal (ZF=1). Not supported in 64-bit mode.
 0F 84 cw   | JZ rel16  | Jump near if 0 (ZF=1). Not supported in 64-bit mode.

 0F 84 cd   | JE rel32  | Jump near if equal (ZF=1).
 0F 84 cd   | JZ rel32  | Jump near if 0 (ZF=1).

 75 cb      | JNE rel8  | Jump short if not equal (ZF=0).
 75 cb      | JNZ rel8  | Jump short if not zero (ZF=0).

 0F 85 cd   | JNE rel32 | Jump near if not equal (ZF=0).
 0F 85 cd   | JNZ rel32 | Jump near if not zero (ZF=0).
Higuaro
fonte
-5
  je : Jump if equal:

  399  3fb:   64 48 33 0c 25 28 00    xor    %fs:0x28,%rcx
  400  402:   00 00
  401  404:   74 05                   je     40b <sims_get_counter+0x51>
leesagacious
fonte