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.)
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)
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).
Respostas:
JE
eJZ
são apenas nomes diferentes para exatamente a mesma coisa: um salto condicional quandoZF
(o sinalizador "zero") é igual a 1.(Da mesma forma,
JNE
eJNZ
são apenas nomes diferentes para um salto condicional quandoZF
é igual a 0.)Você pode usá-los de forma intercambiável, mas deve usá-los dependendo do que está fazendo:
JZ
/JNZ
são mais apropriados quando você está testando explicitamente se algo é igual a zero:JE
eJNE
são mais apropriados após umaCMP
instrução:(Uma
CMP
instrução realiza uma subtração e joga o valor do resultado fora, enquanto mantém os sinalizadores; é por isso que você obtémZF=1
quando os operandos são iguais eZF=0
quando não são.)fonte
jb
/jc
/jnae
todos os testes CF = 1. Consulte felixcloutier.com/x86/jcc (ou cmovcc ou setcc)No manual da Intel - Referência do conjunto de instruções ,
JE
eJZ
têm o mesmo opcode (74
para rel8 /0F 84
para rel 16/32)JNE
eJNZ
(75
para rel8 /0F 85
para rel 16/32) compartilham opcodes.JE
eJZ
ambos verificam oZF
(ou sinalizador zero), embora o manual seja um pouco diferente nas descrições do primeiro uso de rel8JE
eJZ
rel8ZF
, mas basicamente eles são os mesmos.Aqui está um extrato das páginas 464, 465 e 467 do manual.
fonte
fonte