Ich glaube, es hat kein Ergebnis und füllt einfach Platz. Ist das der Fall?Was ist Lea 0x0 (% esi),% esi
Antwort
Es ist ein NOP. Es fügt den Inhalt von% esi und 0x0 hinzu und setzt das Ergebnis in% esi. Jemand hat entweder einen plumpen Code-Generator oder muss N Bytes füllen, wo diese Anweisung die richtige Größe hat.
LEA Befehle werden ziemlich schnell ausgeführt (normalerweise 1 Takt), also ist das viel besser als N Nops.
Das x86 ist so schrullig wie es ist, hat eine Vielzahl von Anweisungen, die effektiv nichts anderes tun, als unterschiedliche Bytes zu füllen. Sie können andere nutzlose Anweisungen unterschiedlicher Länge finden. Sie neigen dazu, Anweisungen zu finden, die lang sind, aber in 1 Uhr oder weniger ausgeführt werden.
Das AMD x86-64-Handbuch enthält einige Vorschläge, was für NOPs zu verwenden ist. sie schlagen einen der Präfix-Opcodes vor, der einige Male vor einem tatsächlichen NOP, IIRC, wiederholt wird. Solche Präfix-Opcodes werden sehr schnell von der Anweisungsabruf-Engine verbraucht; meistens sind ihre Kosten im Instruktions-Pre-Fetch und nicht in der Instruktions-Ausführungszeit verborgen.
- 1. Blockiert oder blockiert ESI?
- 2. ESI in einer Lackkaskade?
- 3. Was 0x0 tut zeigen in der Anweisung
- 4. Zweck der ESI & EDI Register?
- 5. Verständnis lea und Montage
- 6. Varnish nicht verarbeiten ESI enthält
- 7. mit ESI langsamer als EAX?
- 8. Warum erzeugt `lea esi, dword [edx + ecx * 4]` einen Fehler, wenn sie mit NASM zusammengebaut werden?
- 9. esi Tag arbeitet nicht auf Laravel-Anwendung
- 10. Varnish ESI anerkannt, aber nicht enthalten
- 11. Varnish Edge Side Includes (ESI) unterstützt auf Heroku?
- 12. Symfony ESI bricht den Varnish-Cache, wenn Cookies aktiviert sind
- 13. Was bedeutet 0x0 (r15)?
- 14. Warum ist $ {0x0} korrekt?
- 15. Was ist der Unterschied zwischen MOV und LEA?
- 16. LEA Anweisung?
- 17. Warum ist UILabel 0x0?
- 18. Was passiert bevor die _start Funktion in /lib/ld-linux.so.2 aufgerufen wird?
- 19. Was bedeutet data16 in objdump Ausgabe?
- 20. Was ist der Zweck des UD2-Opcodes im Linux-Kernel?
- 21. Assembly - js im Vergleich ja Anweisung
- 22. Unterschied zwischen lea und Offset
- 23. ungerade kompilierten Code
- 24. Thread 1: EXC_BAD_ACCESS (Code = 13, Adresse = 0x0)
- 25. LEA Betrieb mit 8086 Montage
- 26. Unterschied zwischen LEA und MOVE.L?
- 27. was von der Arbeit
- 28. CGContext ungültiger Kontext 0x0
- 29. c printf ("% x"), was wird gedruckt?
- 30. Was bedeutet Fehler "Thread 1: EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0)"?
Letzteres, außer GCC ist ein unbeholfener Code-Generator. Danke für die schnelle Antwort. – Brian
Ein interessanter Punkt ist, dass 'lea 0x0 (% esi),% esi' nur im 32-Bit-Code ein No-Op ist. Im 64-Bit-Code setzt diese Anweisung zusätzlich das höhere Doppelwort von '% rsi'. Bisher habe ich gesehen, dass GCC solche Anweisungen nur in den 32-Bit-Code einfügt. – Eugene
.... also der Punkt von AMDs "empfehlen Multibyte-NOPs". –