2010-02-05 11 views

Respuesta

5

Código que no es un nop real pero que no afecta el comportamiento del programa.

En C, la siguiente secuencia podría ser pensado como un NOP semántica:

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

Un NOP semántico es un conjunto de instrucciones en lenguaje de máquina que no tienen ningún efecto en absoluto o casi ningún efecto (más instrucciones de cambio códigos de condición) cuyo único propósito es ofuscación de lo que el programa realmente está haciendo.

0

Código que se ejecuta pero no hace nada significativo. Estos también se llaman "predicados opacos" y se usan con mayor frecuencia por obfuscators.

1

Son instrucciones que no tienen ningún efecto, como un NOP, pero toman más bytes. Útil para obtener el código alineado con un límite de línea de caché. Una instrucción como lea edi, [edi + 0] es un ejemplo, tomaría 7 NOP para llenar el mismo número de bytes pero toma solo 1 ciclo en vez de 7.

0

Un verdadero "nop semántico" es una instrucción que no tiene más efecto que tomarse un tiempo y avanzar el contador del programa. Muchas máquinas en las que los movimientos de registro para registrar no afectan a los indicadores, por ejemplo, tienen numerosas instrucciones que moverán un registro a sí mismo. En el 8088, por ejemplo, cualquiera de los siguientes sería NOP semánticas:

 
    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 
    ... 

Tenga en cuenta que todo lo anterior a excepción de "hacha xchg, hacha" son instrucciones de dos bytes. Por lo tanto, Intel ha declarado que se debe usar "xchg ax, ax" cuando se requiere un NOP de un byte. De hecho, si uno ensambla "mov ax, ax" y lo desmonta, se desarmará como "NOP".

Tenga en cuenta que, en algunos casos, una instrucción o secuencia de instrucciones puede tener posibles efectos secundarios, pero, no obstante, es más deseable que el "nop" habitual. En el 6502, por ejemplo, si uno necesita un retraso de 7 ciclos y el puntero de la pila es válido pero el valor de la parte superior de la pila es irrelevante, un PHP seguido de un PLP eliminará siete ciclos utilizando solo dos bytes de código. Sin embargo, si el valor de la parte superior de la pila no es un byte de reserva de RAM, la secuencia fallará.