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?
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?
Eigentlich ist es nicht streng a NOP
weil 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 0x90
was 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 NOP
s 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
@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