2010-02-05 5 views

Antwort

5

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

In C, die folgenden Sequenz als semantischer NOP gedacht werden könnte:

{ 
    // Since none of these have side affects, they are effectively no-ops 
    int x = 5; 
    int y = x * x; 
    int z = y/x; 
} 
0

Eine semantische NOP ist eine Sammlung von Anweisungen in Maschinensprache, die an allen oder fast keine Wirkung (die meisten Befehle Änderung keine Auswirkung Condition Codes), deren einziger Zweck die Verschleierung dessen ist, was das Programm tatsächlich macht.

0

Code, der ausführt, aber nichts Sinnvolles tut. Diese werden auch als "opake Prädikate" bezeichnet und werden am häufigsten von obfuscators verwendet.

1

Sie sind Anweisungen, die keine Wirkung haben, wie ein NOP, aber nehmen Sie mehr Bytes. Nützlich, um den Code an einer Cache-Zeilengrenze auszurichten. Eine Anweisung 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 1 statt 7.

0

Ein echter "semantischer nop" ist ein Befehl, der hat keinen anderen Effekt als etwas Zeit zu beanspruchen und den Programmzähler vorzuschieben. Viele Maschinen, bei denen Register-zu-Register-Bewegungen keine Flags beeinflussen, haben beispielsweise zahlreiche Befehle, die ein Register zu sich selbst bewegen. Auf den 8088, zum Beispiel, würde eine der folgenden semantischer NOPs sein:

 
    mov al,al 
    mov bl,bl 
    mov cl,cl 
    ... 
    mov ax,ax 
    mob bx,bx 
    mov cx,cx 
    ... 
    xchg ax,ax 
    xchg bx,bx 
    xchg cx,cx 
    ... 

Beachten Sie, dass alle der oben genannte Ausnahme von „xchg Axt, Axt“ sind zwei-Byte-Befehle. 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" zusammenbaut und es zerlegt, 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 die üblichen "NOP". Wenn auf dem 6502 zum Beispiel eine 7-Zyklus-Verzögerung benötigt wird und der Stapelzeiger gültig ist, aber der Wert des obersten Stapels 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.