W kodzie montażu x86 są JE
i JNE
dokładnie takie same, jak JZ
i JNZ
?Różnica między JE/JNE i JZ/JNZ
Odpowiedz
JE
i JZ
to tylko różne nazwy dla dokładnie to samo: a warunkowy skok gdy ZF
(flaga „zero”) jest równy 1.
(Podobnie JNE
i JNZ
to tylko różne nazwy warunkowy skok gdy ZF
jest równa 0.)
ty mogli używać ich zamiennie, ale powinny używać ich w zależności od co robisz:
JZ
/JNZ
są bardziej odpowiednie, kiedy są wyraźnie testując czegoś jest równa zeru:dec ecx jz counter_is_now_zero
JE
iJNE
są bardziej odpowiednie po instrukcjiCMP
:cmp edx, 42 je the_answer_is_42
(Instrukcja A
CMP
wykonuje odejmowanie i wyrzuca wartość wyniku, zachowując flagi; dlatego maszZF=1
gdy argumenty są równe iZF=0
gdy nie jesteś.)
Z Intel's manual - Instruction Set Reference The JE
i JZ
mają ten sam kod operacji (74
dla rel8/0F 84
dla rel 16/32) również dla opcji opcodes share JNE
i JNZ
(75
dla rel8/0F 85
dla rel 16/32).
JE
i JZ
oboje kontrolnego dla ZF
(lub zero flag), chociaż instrukcja różni się nieznacznie w opisach pierwszej JE
rel8 i JZ
rel8 ZF
użytkowania, ale w zasadzie są one takie same.
Oto fragment od strony 464, 465 i 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. Różnica między unwrapObservable i()
- 2. Różnica między "**/* /" i "** /"?
- 3. Różnica między | = i^= css
- 4. Composer.phar różnica między | i ||
- 5. Różnica między "% ~ dp0" i ". \"?
- 6. Różnica między ". +" I ". +?"
- 7. MySQL: Różnica między ",", "i"
- 8. Różnica między (++ i) oraz (i ++)
- 9. Różnica kręgosłupa Różnica między CompositeView i CollectionView?
- 10. Różnica między logger.info i logger.debug
- 11. Różnica między fgets i fscanf?
- 12. Różnica między NSLog i DLog
- 13. Różnica między RoutedEventHandler i EventHandler
- 14. Różnica między obrysem i wypełnieniem?
- 15. Różnica między Parameters.Add i Parameters.AddWithValue
- 16. Różnica między putback() i unget()
- 17. Różnica między Delegate.BeginInvoke i Thread.Start
- 18. Różnica między TVar i TMVar
- 19. Różnica między DatagramSocket i DatagramChannel
- 20. Różnica między intent.setClass() i intent.setComponent()
- 21. różnica między -lgcc_s i gcc
- 22. Różnica między string.ToLower i TextInfo.ToLower
- 23. Różnica między javax.sql i java.sql?
- 24. Różnica między paint() i paintcomponent()?
- 25. Różnica między app.all ("*") i app.use ("/")
- 26. Różnica między c() i append()
- 27. Różnica między KeyEventArgs.systemKey i KeyEventArgs.Key
- 28. Różnica między org.apache.spark.ml.classification i org.apache.spark.mllib.classification
- 29. Różnica między GotFocus i GotKeyboardFocus
- 30. Różnica między JVM i HotSpot?
instrukcji Long Odpowiedź: Tak. –
Krótka odpowiedź: nie. (Ale odpowiadają * dokładnie * temu samemu kodowi maszyny, więc robią * dokładnie * to samo.Mają tylko różne mnemoniki dla tego samego porównania.) –
JE oznacza skok, jeśli jest równy, jest równy, jeśli wcześniejszy ustawiona flaga z, JZ oznacza przeskok, jeśli ustawiona jest flaga z. Są dokładnie takie same, niektórzy ludzie chcą myśleć/pisać w kategoriach mojego porównania było równe lub nie równe. Niektórzy ludzie myślą i piszą w kategoriach "flaga flag" lub "flaga z". –