Was ist der Sinn von LEA EAX, [EAX]?

Lesezeit: 2 Minuten

Benutzeravatar von Frederick The Fool
Friedrich der Narr

LEA EAX, [EAX]

Ich bin auf diese Anweisung in einer Binärdatei gestoßen, die mit dem Microsoft C-Compiler kompiliert wurde. Es kann den Wert von EAX eindeutig nicht ändern. Warum ist es dann da?

  • @Potatoswatter: Ja, dies ist eine Release-Version der Binärdatei, daher sollte die Optimierung aktiviert sein. Außerdem verwende ich ollydbg zum Disassemblieren.

    – Friedrich der Narr

    24. April 2010 um 6:04 Uhr

  • Haben Sie die entsprechende C-Anweisung für dieses Juwel?

    – Wikser

    24. April 2010 um 6:09 Uhr


  • @Wikser: Nein. Und das ist kein Einzelfall. Ich habe ein oder zwei andere wie LEA EBX gesehen, [EBX] in der gleichen Binärdatei. Tatsächlich schaue ich mir gerade den letzten auf meinem Bildschirm an. Ollydbg zeigt den Operationscode für diesen (LEA EBX, [EBX] das heißt) als “8D9B 00000000”

    – Friedrich der Narr

    24. April 2010 um 6:13 Uhr


  • Wenn das eine 64-Bit-Binärdatei ist, dann ist es nur eine Null aus den oberen 32 Bits

    – phuklv

    31. Oktober 2013 um 1:57 Uhr

  • Eigentlich ist es nicht streng a NOPweil es eine Datenabhängigkeit von einführt EAX. Moderne CPUs erkennen dieses spezifische Muster als a NOP und ignorieren Sie die Datenabhängigkeit, aber einige ältere CPUs möglicherweise nicht.

    – Jörg W Mittag

    24. April 2010 um 14:44 Uhr

  • Eigentlich ist der Opcode für nop ist 0x90was dasselbe ist wie xchg eax, eax

    – Nathan Fellmann

    24. April 2010 um 18:14 Uhr

  • Nun, es ist falsch, dass “moderne CPUs dieses spezifische Muster als NOP erkennen”, sie führen es immer noch ein FALSCH Datenabhängigkeitsketten. Es gibt nur einige echte NOPs, bei denen die Decoder einfach keine Datenabhängigkeiten einführen.

    – Quonux

    14. Juli 2010 um 22:48 Uhr


  • @Quonux die Multibyte-NOPs wurden vor langer Zeit offiziell gemacht. Diese Antwort hat auch Intels offizielle NOPs von 2 bis 9 Bytes aufgelistet

    – phuklv

    24. Juni 2014 um 2:25 Uhr


  • Zu sagen, es ist ein NOP ist nur die halbe Antwort (aber seltsamerweise die ausgewählte). Erklären Sie, warum Sie dies tun möchten NOPs ist die vollständige Antwort. Gut erledigt.

    – NUR MEINE richtige MEINUNG

    24. April 2010 um 7:22 Uhr

  • Ich bin auch mit dem MSVC++-Compiler darauf gestoßen.

    – Jeroen Baert

    14. August 2015 um 10:08 Uhr

  • Es ist optimierter Code in Ordnung. Aber wie rechtfertigt/erklärt das diesen LEA?

    – Friedrich der Narr

    24. April 2010 um 6:05 Uhr


  • @Frederick: Wäre es nicht optimiert worden, wäre es wohl sinnvoll, wenn der Compiler LEA für eine Art Berechnung verwendet und ein Sonderfall diese redundante Anweisung generiert (dies geschieht in nicht optimiertem Code).

    – Eli Bendersky

    24. April 2010 um 6:09 Uhr

  • Dies ist eine Binärdatei, die von meiner Firma für Kunden freigegeben wurde. Es muss also die optimierte Version sein.

    – Friedrich der Narr

    24. April 2010 um 6:15 Uhr

  • “Also muss es die optimierte Version sein”. Nicht unbedingt. Was ist, wenn sie vergessen haben, es einzuschalten? /O2?

    – Alex Budowski

    24. April 2010 um 6:26 Uhr


  • Die LEA-Anweisung könnte auf einem Pentium 4 schneller ausgeführt werden als eine MOV-Anweisung (und Berechnungen sind mit LEA auch heute noch schnell), daher würde ich dies als Grund für LEA angeben.

    – Quonux

    14. Juli 2010 um 22:51 Uhr

1402680cookie-checkWas ist der Sinn von LEA EAX, [EAX]?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy