Jawaban singkatnya: tidak. (Tetapi keduanya sesuai dengan kode mesin yang persis sama, jadi mereka melakukan hal yang persis sama. Mereka hanya memiliki mnemonik yang berbeda untuk perbandingan yang sama.)
4
JE berarti lompat jika sama, itu sama jika perbandingan sebelumnya memiliki set bendera z, JZ berarti melompat jika bendera z disetel. Mereka persis sama, beberapa orang ingin berpikir / menulis dalam hal perbandingan saya sama atau tidak sama. Beberapa orang berpikir dan menulis tentang apakah z flag set atau z flag clear.
old_timer
Jawaban:
127
JEdan JZhanya nama yang berbeda untuk hal yang persis sama: lompatan bersyarat ketika ZF(tanda "nol") sama dengan 1.
(Demikian pula, JNEdan JNZhanya nama yang berbeda untuk lompatan bersyarat jika ZFsama dengan 0.)
Anda dapat menggunakannya secara bergantian, tetapi Anda harus menggunakannya tergantung pada apa yang Anda lakukan:
JZ/ JNZlebih sesuai saat Anda secara eksplisit menguji sesuatu yang sama dengan nol:
dec ecx
jz counter_is_now_zero
JEdan JNElebih sesuai setelah CMPinstruksi:
cmp edx, 42
je the_answer_is_42
(Sebuah CMPinstruksi melakukan pengurangan, dan membuang nilai hasilnya, sambil mempertahankan bendera; itulah mengapa Anda mendapatkan ZF=1ketika operannya sama dan ZF=0kapan tidak.)
TL: DR: operasi mesin yang sama, makna semantik berbeda . Sama seperti jb/ jc/ jnaesemua pengujian CF = 1. Lihat felixcloutier.com/x86/jcc (atau cmovcc atau setcc)
Peter Cordes
36
Dari manual Intel - Referensi Set Instruksi , JEdan JZmemiliki opcode yang sama ( 74untuk rel8 / 0F 84untuk rel 16/32) juga JNEdan JNZ( 75untuk rel8 / 0F 85untuk rel 16/32) berbagi opcode.
JEdan JZmereka berdua cek untuk ZF(atau nol bendera), meskipun berbeda panduan sedikit dalam deskripsi pertama JErel8 dan JZrel8 ZFpenggunaan, tetapi pada dasarnya mereka adalah sama.
Ini adalah kutipan dari halaman manual 464, 465 dan 467.
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).
Jawaban:
JE
danJZ
hanya nama yang berbeda untuk hal yang persis sama: lompatan bersyarat ketikaZF
(tanda "nol") sama dengan 1.(Demikian pula,
JNE
danJNZ
hanya nama yang berbeda untuk lompatan bersyarat jikaZF
sama dengan 0.)Anda dapat menggunakannya secara bergantian, tetapi Anda harus menggunakannya tergantung pada apa yang Anda lakukan:
JZ
/JNZ
lebih sesuai saat Anda secara eksplisit menguji sesuatu yang sama dengan nol:JE
danJNE
lebih sesuai setelahCMP
instruksi:(Sebuah
CMP
instruksi melakukan pengurangan, dan membuang nilai hasilnya, sambil mempertahankan bendera; itulah mengapa Anda mendapatkanZF=1
ketika operannya sama danZF=0
kapan tidak.)sumber
jb
/jc
/jnae
semua pengujian CF = 1. Lihat felixcloutier.com/x86/jcc (atau cmovcc atau setcc)Dari manual Intel - Referensi Set Instruksi ,
JE
danJZ
memiliki opcode yang sama (74
untuk rel8 /0F 84
untuk rel 16/32) jugaJNE
danJNZ
(75
untuk rel8 /0F 85
untuk rel 16/32) berbagi opcode.JE
danJZ
mereka berdua cek untukZF
(atau nol bendera), meskipun berbeda panduan sedikit dalam deskripsi pertamaJE
rel8 danJZ
rel8ZF
penggunaan, tetapi pada dasarnya mereka adalah sama.Ini adalah kutipan dari halaman manual 464, 465 dan 467.
sumber
sumber