Perbedaan antara JE / JNE dan JZ / JNZ

92

Dalam kode assembly x86, apakah JEdan JNEpersis sama dengan JZdan JNZ?

QuasarDonkey
sumber
60
Jawaban panjangnya: ya.
Hans Passant
9
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.)

Matthew Slattery
sumber
2
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).
higuaro
sumber
-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>
riang
sumber