Nel codice assembly x86, sono JE
e JNE
esattamente identici a JZ
e JNZ
?Differenza tra JE/JNE e JZ/JNZ
risposta
JE
e JZ
sono solo nomi diversi per esattamente la stessa cosa: un salto condizionato quando ZF
(il flag "zero") è uguale a 1.
(Allo stesso modo, JNE
e JNZ
sono solo nomi diversi per un salto condizionato quando ZF
è uguale a 0.)
si potrebbe usarli in modo intercambiabile, ma si dovrebbe usarle a seconda quello che state facendo:
JZ
/JNZ
sono più appropriato quando si esegue il test in modo esplicito per qualcosa che è uguale a zero:dec ecx jz counter_is_now_zero
JE
eJNE
sono più appropriata dopo un'istruzioneCMP
:cmp edx, 42 je the_answer_is_42
(A
CMP
l'istruzione esegue una sottrazione e getta via il valore del risultato mantenendo le bandiere; che è il motivo per cui si ottieneZF=1
quando gli operandi sono uguali eZF=0
quando non lo sono.)
Dal Intel's manual - Instruction Set Reference, il JE
e JZ
hanno lo stesso codice operativo (74
per REL8/0F 84
per rel 16/32) anche JNE
e JNZ
(75
per rel8/0F 85
per rel 16/32) condivisione di opcode.
JE
e JZ
entrambi controllo per la (o bandiera zero) ZF
, anche se il manuale differisce leggermente nelle descrizioni della prima JE
REL8 e JZ
REL8 ZF
utilizzo, ma fondamentalmente sono uguali.
Ecco un estratto dalle pagine del manuale 464, 465 e 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).
- 1. La differenza tra $ * e $ @
- 2. Differenza tra $ # e $ {# @}
- 3. Differenza tra. e #
- 4. MySQL: Differenza tra ",", "e"
- 5. Differenza tra "o" e "||"
- 6. Differenza tra unwrapObservable e()
- 7. Differenza tra oggetto e *?
- 8. Differenza tra "**/* /" e "** /"?
- 9. Differenza tra jquery e $
- 10. CMake: differenza tra $ {} e "$ {}"
- 11. Differenza tra ". +" E ". +?"
- 12. VBA: Differenza tra & e +
- 13. Differenza tra numpy.logical_and e &
- 14. Differenza tra | = e^= css
- 15. Differenza tra `% in%` e `` ==
- 16. Differenza tra Dizionario e Hashtable
- 17. Differenza tra SCM e SVN
- 18. differenza tra RDLC e SSRS
- 19. Differenza tra REMOTE_HOST e REMOTE_ADDR
- 20. Differenza tra "\ n" e Environment.NewLine
- 21. Differenza tra QSharedPointer e QSharedDataPointer?
- 22. Differenza tra toFixed() e toPrecision()?
- 23. Differenza tra strncpy e memcpy?
- 24. Differenza tra crittografia e hashing
- 25. Differenza tra Assembly.CreateInstance e Activator.CreateInstance?
- 26. Differenza tra coredata e sqlite
- 27. Differenza tra Html.RenderAction e Html.Action
- 28. differenza tra System.out.printf e String.format
- 29. Differenza tra UIViewContentModeScaleAspectFit e UIViewContentModeScaleToFill?
- 30. Differenza tra MDB e JMS
risposta lunga: sì. –
Risposta breve: no. (Ma corrispondono esattamente * allo stesso codice macchina, quindi fanno esattamente * la stessa cosa: hanno solo mnemonici diversi per lo stesso confronto.) –
JE significa saltare se uguale, è uguale se un confronto precedente ha il z flag set, JZ significa saltare se è impostato il flag z. Sono esattamente gli stessi, alcune persone vogliono pensare/scrivere in termini di paragone uguale o non uguale. Alcuni pensano e scrivono in termini di z flag o z flag clear. –