Dalam kode assembly x86, apakah JEdan JNEpersis sama dengan JZdan JNZ?
Dalam kode assembly x86, apakah JEdan JNEpersis sama dengan JZdan JNZ?
Jawaban:
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.)
jb/ jc/ jnaesemua pengujian CF = 1. Lihat felixcloutier.com/x86/jcc (atau cmovcc atau setcc)
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).