ในรหัส x86 ชุมนุมเป็นJE
และJNE
เหมือนกับJZ
และJNZ
?
ในรหัส x86 ชุมนุมเป็นJE
และJNE
เหมือนกับJZ
และJNZ
?
คำตอบ:
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
เมื่อไม่เท่ากัน)
jb
/ jc
/ jnae
การทดสอบทั้งหมด CF = 1 ดูfelixcloutier.com/x86/jcc (หรือ cmovcc หรือ setcc)
จากอินเทลคู่มือ - ชุดคำสั่งการอ้างอิงที่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 แรกแต่โดยพื้นฐานแล้วจะเหมือนกันJZ
ZF
นี่คือสารสกัดจากคู่มือหน้า 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).
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>