2012-05-08 6 views

Antwort

16

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

Letzteres, außer GCC ist ein unbeholfener Code-Generator. Danke für die schnelle Antwort. – Brian

+3

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

+3

.... also der Punkt von AMDs "empfehlen Multibyte-NOPs". –