Assembly: Was sind semantische NOPs?

8

Ich habe mich gefragt, was sind "semantische NOPs" in der Montage?

    
Benjamin 05.02.2010, 06:13
quelle

5 Antworten

5

Code, der kein tatsächlicher NOP ist, aber das Verhalten des Programms nicht beeinflusst.

In C könnte die folgende Sequenz als eine semantische NOP betrachtet werden:

%Vor%     
R Samuel Klatchko 05.02.2010, 06:24
quelle
1

Sie sind Anweisungen, die keine Wirkung haben, wie ein NOP, aber nehmen mehr Bytes. Nützlich, um den Code an einer Cache-Zeilengrenze auszurichten. Ein Befehl wie lea edi, [edi + 0] ist ein Beispiel, es würde 7 NOPs benötigen, um die gleiche Anzahl von Bytes zu füllen, aber nur einen Zyklus statt 7.

    
Hans Passant 05.02.2010 18:00
quelle
0

Ein semantisches NOP ist eine Sammlung von Maschinensprachanweisungen, die überhaupt keine oder fast keine Wirkung haben (die meisten Befehle ändern die Bedingungscodes), deren einziger Zweck die Verschleierung dessen ist, was das Programm tatsächlich macht.

    
Anonymous Coward 05.02.2010 07:25
quelle
0

Code, der ausgeführt wird, aber nichts Sinnvolles tut. Diese werden auch als "undurchsichtige Prädikate" bezeichnet und werden am häufigsten von Obfuscators .

    
quelle
0

Ein wahrer "semantischer nop" ist eine Anweisung, die keinen anderen Effekt hat, als sich Zeit zu nehmen und den Programmzähler weiterzuschieben. Viele Maschinen, bei denen Register-zu-Register-Bewegungen keine Flags beeinflussen, haben beispielsweise zahlreiche Befehle, die ein Register zu sich selbst bewegen. Auf dem 8088 wäre zum Beispiel jeder der folgenden semantischen NOPs:

%Vor%

Beachten Sie, dass alle obigen Ausnahmen außer "xchg ax, ax" Zwei-Byte-Anweisungen sind. Intel hat daher erklärt, dass "xchg ax, ax" verwendet werden soll, wenn ein Ein-Byte-NOP benötigt wird. In der Tat, wenn man "mov ax, ax" zusammensetzt und auseinander baut, zerlegt es als "NOP".

Beachten Sie, dass in einigen Fällen eine Anweisung oder Anweisungsfolge mögliche Nebenwirkungen haben kann, aber dennoch wünschenswerter als das übliche "nop" ist. Wenn auf dem 6502 zum Beispiel eine 7-Zyklus-Verzögerung benötigt wird und der Stapelzeiger gültig ist, aber der oberste Stapelwert irrelevant ist, wird ein PHP, gefolgt von einem PLP, sieben Zyklen mit nur zwei Byte Code beenden. Wenn der oberste Wert des Stapels kein Ersatzbyte des RAM ist, würde die Sequenz jedoch fehlschlagen.

    
supercat 13.12.2010 17:40
quelle

Tags und Links