ความแตกต่างระหว่าง JE / JNE และ JZ / JNZ


92

ในรหัส x86 ชุมนุมเป็นJEและJNEเหมือนกับJZและJNZ?


60
คำตอบแบบยาว: ใช่
Hans Passant

9
คำตอบสั้น ๆ : ไม่ ( แต่พวกเขาตรงตามลักษณะที่ว่ารหัสเครื่องเดียวกันเพื่อให้พวกเขาทำว่าสิ่งเดียวกันพวกเขาก็มีความจำที่แตกต่างกันสำหรับการเปรียบเทียบเดียวกัน..)

4
JE หมายถึงการกระโดดหากเท่ากันก็เท่ากับหากการเปรียบเทียบก่อนหน้ามีการตั้งค่าแฟล็ก z JZ หมายถึงกระโดดหากตั้งค่าแฟล็ก z พวกเขาเหมือนกันทุกประการบางคนต้องการที่จะคิด / เขียนในแง่ของการเปรียบเทียบของฉันว่าเท่ากันหรือไม่เท่ากัน บางคนคิดและเขียนในแง่ของคือชุดธง z หรือธง z ชัดเจน
old_timer

คำตอบ:


127

JEและJZเป็นเพียงชื่อที่แตกต่างกันสำหรับสิ่งเดียวกัน: การกระโดดตามเงื่อนไขเมื่อZF(แฟล็ก "ศูนย์") เท่ากับ 1

(ในทำนองเดียวกันJNEและJNZเป็นเพียงชื่อที่แตกต่างกันสำหรับการกระโดดแบบมีเงื่อนไขเมื่อZFเท่ากับ 0)

คุณสามารถใช้แทนกันได้ แต่ควรใช้ขึ้นอยู่กับสิ่งที่คุณกำลังทำ:

  • JZ/ JNZมีความเหมาะสมมากขึ้นเมื่อคุณกำลังทดสอบอย่างชัดเจนว่ามีค่าเท่ากับศูนย์:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEและJNEเหมาะสมกว่าหลังจากCMPคำแนะนำ:

    cmp  edx, 42
    je   the_answer_is_42
    

    ( CMPคำสั่งทำการลบและโยนค่าของผลลัพธ์ออกไปในขณะที่รักษาแฟล็กไว้นั่นคือเหตุผลที่คุณได้รับZF=1เมื่อตัวถูกดำเนินการเท่ากันและZF=0เมื่อไม่เท่ากัน)


2
TL: DR: การทำงานของเครื่องเดียวกันที่แตกต่างกันความหมายความหมาย เช่นเดียวกับjb/ jc/ jnaeการทดสอบทั้งหมด CF = 1 ดูfelixcloutier.com/x86/jcc (หรือ cmovcc หรือ setcc)
Peter Cordes

36

จากอินเทลคู่มือ - ชุดคำสั่งการอ้างอิงที่JEและJZมี opcode เดียวกัน ( 74สำหรับ rel8 / 0F 84สำหรับ rel 16/32) ยัง JNEและJNZ( 75สำหรับ rel8 / 0F 85สำหรับ rel 16/32) opcodes หุ้น

JEและJZทั้งคู่ตรวจสอบแฟล็กZF(หรือศูนย์) แม้ว่าคู่มือจะแตกต่างกันเล็กน้อยในคำอธิบายของการใช้งานrel8 JEและ rel8 แรกแต่โดยพื้นฐานแล้วจะเหมือนกันJZZF

นี่คือสารสกัดจากคู่มือหน้า 464, 465 และ 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).

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.