NOP
# NOP

En informática, un NOP, no-op o NOOP (pronunciado "no op"; abreviatura de no operation) es una instrucción de código máquina y su mnemotécnico lenguaje ensamblador, una declaración de lenguaje de programación, o comando de un protocolo de ordenador que no hace nada.

## Instrucciones de lenguaje máquina

Algunos conjuntos de instrucciones de ordenador incluyen una instrucción cuyo propósito explícito es no cambiar el estado de ninguno de los registros, indicadores de estado o memoria. A menudo se necesita un número bien definido de ciclos de reloj para ejecutarse. En otros conjuntos de instrucciones, no hay una instrucción NOP explícita, pero el mnemotécnico NOP del lenguaje ensamblador representa una instrucción que actúa como NOP; por ejemplo, en el SPARC, sethi 0, %g0.

Un NOP no debe acceder a la memoria, ya que eso podría causar una fallo de memoria o fallo de página.

Un NOP se usa más comúnmente con fines de temporización, para forzar la alineación de memoria, para evitar peligro, para ocupar un hueco de retardo, para invalidar una instrucción existente, como un salto, como objetivo de una instrucción de ejecución, o como marcador de posición para ser reemplazada por instrucciones activas más adelante en el desarrollo del programa (o para reemplazar las instrucciones eliminadas cuando la reorganización sería problemática o requiere mucho tiempo). En algunos casos, un NOP puede tener efectos secundarios menores; por ejemplo, en la serie de procesadores Motorola 68000, el código de operación NOP provoca una sincronización del pipeline.

| Arquitectura CPU | Instrucción mnemotécnico | Bytes | Código de operación | Notas |
| - | - | - | - | - |
| Familia intel x86 CPU | NOP | 1; 1–9 para i686 y x86-64 | 0x90 | 0x90 se traduce como xchg eax, eax en todos los modos excepto en long mode, donde el código de operación 0x90 todavía no tiene efecto. Las codificaciones más largas se describen en el manual de Intel. |
| Familia Intel 8051 / MCS-51 | NOP | 1 | 0x00 | |
| ARM A32 | NOP | 4 | 0x00000000 | Esto se traduce como andeq r0, r0, r0. La instrucción de ensamblado nop probablemente se expandirá a mov r0, r0 que está codificada 0xE1A00000 (arquitectura little-endian). |
| ARM T32 (16 bit) | NOP | 2 | 0xb000 | Código de operación para ADD SP, #0: se añade cero al puntero de pila (sin operación). La instrucción de ensamblado nop probablemente se expandirá a mov r8, r8 que está codificada como 0x46C0. |
| ARM T32 (32 bit) | NOP | 4 | 0xF3AF 8000 | |
| ARM A64 (64 bit) | NOP | 4 | 0xD503201F | |
| AVR | NOP | 2 | 0x0000 | un ciclo de reloj |
| IBM System/360, IBM System/370, IBM System/390, z/Architecture, UNIVAC Series 90 | NOP | 4 | 0x47000000 o 0x470nnnnn o 0x47n0nnnn donde "n" es cualquier valor de 4-bit. | NOP ("No-Op") y NOPR ("No-Op Register") son un subconjunto de las instrucciones "Branch on Condition" o "Branch on Condition Register", respectivamente; ambas versiones tienen dos opciones para generar un NO-OP. En el caso de las instrucciones NOP y NOPR, el primer 0 en el segundo byte es el valor de "máscara", la condición para probar como igual, no igual, alto, bajo, etc. Si la máscara es 0, no se produce bifurcación. En el caso de la instrucción NOPR, el segundo valor en el segundo byte es el registro en el que se bifurca. Si se elige el registro 0, no se produce ninguna bifurcación independientemente del valor de la máscara. Por lo tanto, si cualquiera de los dos valores en el segundo byte es 0, la bifurcación no ocurrirá. En el caso de la instrucción NOP, el segundo valor en el segundo byte es el registro "base" de una combinación de registro base, registro de desplazamiento y dirección de desplazamiento. Si el registro base también es 0, la bifurcación no se toma independientemente del valor del registro de desplazamiento o de la dirección de desplazamiento. |
| IBM System/360, IBM System/370, IBM System/390, z/Architecture, UNIVAC Series 90 | NOPR | 2 | 0x0700 o 0x070n o 0x07n0 donde "n" es cualquier valor de 4-bit. | NOP ("No-Op") y NOPR ("No-Op Register") son un subconjunto de las instrucciones "Branch on Condition" o "Branch on Condition Register", respectivamente; ambas versiones tienen dos opciones para generar un NO-OP. En el caso de las instrucciones NOP y NOPR, el primer 0 en el segundo byte es el valor de "máscara", la condición para probar como igual, no igual, alto, bajo, etc. Si la máscara es 0, no se produce bifurcación. En el caso de la instrucción NOPR, el segundo valor en el segundo byte es el registro en el que se bifurca. Si se elige el registro 0, no se produce ninguna bifurcación independientemente del valor de la máscara. Por lo tanto, si cualquiera de los dos valores en el segundo byte es 0, la bifurcación no ocurrirá. En el caso de la instrucción NOP, el segundo valor en el segundo byte es el registro "base" de una combinación de registro base, registro de desplazamiento y dirección de desplazamiento. Si el registro base también es 0, la bifurcación no se toma independientemente del valor del registro de desplazamiento o de la dirección de desplazamiento. |
| SuperH | NOP | 2 | 0x0009 | |
| MIPS | NOP | 4 | 0x00000000 | Se traduce como sll r0,r0,0, que significa: Desplazamiento lógico de los bits cero del registro 0 a la izquierda y almacena el resultado en el registro 0. Las escrituras en el registro 0 se ignoran; siempre contiene 0. |
| MIPS-X | NOP | 4 | 0x60000019 | (opcode extendido para add r0,r0,r0) |
| MIX | NOP | 1 palabra | ± * * * * 0 | Los * los bytes son arbitrarios y pueden ser desde 0 hasta el byte máximo (se requiere que esté en el rango 63-99). MIX usa representación de magnitud-signo. |
| MMIX | SWYM | 4 | 0xFD****** | SWYM se traduce como "Sympathize with your machinery". Los * dígitos pueden ser elegidos arbitrariamente. |
| Familia Motorola 68000 | NOP | 2 | 0x4E71 | Esto sincroniza el pipeline y evita la superposición de instrucciones. |
| Motorola 6809 | NOP | 1 | 0x12 | |
| Familia MOS Technology 65xx (e.g. 6502) | NOP | 1 | 0xEA | NOP consume dos ciclos de reloj. Los códigos de operación no definidos en las versiones de NMOS de la familia 65xx se convirtieron en NOP de diferentes longitudes de instrucción y tiempos de ciclo en el 65C02. |
| PowerPC | NOP | 4 | 0x60000000 | (opcode extendido para ori r0,r0,0) |
| Microcontrolador PIC | NOP | 12 bits | 0b000000000000 | MOVW 0,W |
| RISC-V | NOP | 4 | 0x00000013 | ADDI x0, x0, 0 |
| SPARC | NOP | 4 | 0x01000000 | Se traduce como sethi 0, %g0 que pone a cero el registro de ceros %g0 register |
| Z80 | NOP | 1 | 0x00 | Hay algunas otras instrucciones sin ningún efecto (y en el mismo tiempo): LD A, A, LD B, B etc. |
| PDP-10 | JFCL 0, (conventional) JUMP, SETA, SETAI, CAI, TRN, TLN | 1 palabra | 25500******* (octal) | Nunca saltar Nunca saltar, no configurar nada |
| PDP-11 | NOP | 16 bits | 000240 (octal) | No borra ninguno de los códigos de condición |
| VAX | NOP | 1 | 0x01 | El retardo depende del tipo de procesador |

Desde el punto de vista del diseño de hardware, las áreas no mapeadas de un bus a menudo están diseñadas para devolver ceros; dado que el comportamiento de NOP slide es a menudo deseable, da un sesgo para codificarlo con el código de operación de ceros.

## Código

Una función o una secuencia de declaraciones de lenguaje de programación es una declaración NOP o nula si no tiene ningún efecto. Las declaraciones nulas pueden ser requeridas por la sintaxis de algunos lenguajes en ciertos contextos.

### Ada

En Ada, la instrucción null sirve como NOP. Como la sintaxis prohíbe que las declaraciones o funciones de control estén vacías, la declaración null debe usarse para especificar que no se requiere ninguna acción. (Por lo tanto, si el programador se olvida de escribir una secuencia de sentencias, el programa no podrá compilar).

### C y derivados

La declaración NOP más simple en C es la declaración nula, que es solo un punto y coma en un contexto que requiere una declaración.

Un bloque vacío (sentencia compuesta) también es un NOP y puede ser más legible:

En algunos casos, como en el cuerpo de una función, se debe usar un bloque, pero este puede estar vacío. En C, las declaraciones no pueden estar vacías; las declaraciones simples deben terminar con ; (punto y coma) mientras que las sentencias compuestas están encerradas entre (llaves), que no necesita un punto y coma a continuación. Por lo tanto, en contextos donde se requiere una declaración gramaticalmente, se puede usar alguna de estas declaraciones nulas.

La declaración nula es inútil por sí misma, pero puede tener un uso sintáctico en un contexto más amplio, por ejemplo, dentro del contexto de un bucle:

alternativamente,

o concretamente:

(Téngase en cuenta que la última forma puede ser confusa y, como tal, genera una advertencia en algunos compiladores u opciones del compilador, ya que el punto y coma generalmente indica una instrucción de llamada de fin de función cuando se coloca después de un paréntesis al final de la línea).

El código anterior continúa llamando a la función getchar hasta que devuelve un carácter \n (nueva línea), esencialmente avanzando rápidamente la ubicación de lectura actual de la entrada estándar al comienzo de la siguiente línea.

### Fortran

En Fortran, la declaración CONTINUE se usa en algunos contextos, como la última declaración en un bucle DO, aunque se puede usar en cualquier lugar y no tiene ninguna funcionalidad.

### JavaScript

El lenguaje JavaScript no tiene una declaración NOP incorporada. Muchas implementaciones son posibles:

* Usar el ; declaración vacía o la sentencia de bloque vacía de la misma forma que en los ejemplos de C y derivados;
* Usar la expresión undefined o null como una declaración completa (una declaración de expresión) cuando la sintaxis no permita los métodos anteriores.

Las alternativas, en situaciones donde se requiere una función, son:

* Utilizar la función integrada Function.prototype, que acepta cualquier argumento y devuelve undefined;
* Usar una función NOP disponible en una biblioteca de terceros; véase abajo;
* Definir una función NOP personalizada, como en el siguiente ejemplo (usando la sintaxis de la función flecha ES6):

**AngularJS**

El framework AngularJS proporciona la función angular.noop que no realiza operaciones.

**jQuery**

La biblioteca jQuery proporciona una función jQuery.noop, que no hace nada.

**Lodash**

La biblioteca Lodash proporciona una función _.noop, que devuelve indefinido y no hace nada.

### Pascal

Al igual que con C, el ; usado por sí mismo se puede usar como una declaración nula en Pascal. De hecho, debido a la especificación del idioma, en un bloque BEGIN / END, el punto y coma es opcional antes de la instrucción END, por lo que el punto y coma utilizado utilizado ahí es superfluo.

Además, un bloque que consta de BEGIN END; se puede usar como marcador de posición para indicar que no se realiza ninguna acción, incluso si se coloca dentro de otro bloque BEGIN/END.

### Python

El lenguaje de programación Python tiene una declaración pass que no tiene efecto cuando se ejecuta y, por lo tanto, sirve como un NOP. Se utiliza principalmente para garantizar la sintaxis correcta debido a la sintaxis sensible a la sangría de Python; por ejemplo, la sintaxis para la definición de una clase requiere un bloque sangrado con la lógica de la clase, que debe expresarse como pass cuando debería estar vacío.

### Shell scripting (bash, zsh, etc.)

El comando ':' [dos puntos] es un comando integrado de shell que tiene un efecto similar a un "NOP" (una operación de no hacer nada). No es técnicamente un NOP, ya que cambia el parámetro especial $? (estado de salida del último comando) a 0. Se puede considerar un sinónimo del shell incorporado 'verdadero', y su estado de salida es verdadero (0).

### Lenguaje de macros TeX (ConTeXt, LaTeX, etc.)

El lenguaje de macros del sistema tipográfico TeX tiene el comando \relax. Este no hace nada por sí mismo, pero puede usarse para evitar lo inmediatamente anterior.

## Comandos de protocolo NOP

Muchos protocolos de comunicaciones, como telnet, incluyen un comando NOP que un cliente puede emitir para solicitar una respuesta del servidor sin solicitar ninguna otra acción. Dicho comando se puede usar para un keepalive (asegurarse de que la conexión aún esté activa) o que el servidor responda. Un comando NOOP es parte de los siguientes protocolos ("esta es una lista parcial"):

* telnet
* FTP
* SMTP
* X11
* POP3
* NNTP
* finger
* IMAP4
* BitTorrent

Tenga en cuenta que, a diferencia de los otros protocolos enumerados, el comando IMAP4 NOOP tiene un propósito específico: permite que el servidor envíe cualquier notificación pendiente al cliente.

Si bien la mayoría de los servidores telnet o FTP responden a un comando NOOP con "OK" o "+OK", algunos programadores han agregado respuestas peculiares al cliente. Por ejemplo, el demonio ftpd de MINIX responde a NOOP con el mensaje:

## Cracking

Los NOP a menudo están involucrados en software crackeado que verifica números de serie, requisitos específicos de hardware o software, presencia o ausencia de dongles de hardware, etc. Este proceso se lleva a cabo modificando funciones y subrutinas para omitir las comprobaciones de seguridad y, en su lugar, simplemente devolver el valor esperado que se está comprobando. Debido a que la mayoría de las instrucciones en la rutina de verificación de seguridad no se usarán, estas se reemplazarán con NOP, eliminando así la funcionalidad de seguridad del software sin alterar el posicionamiento de todo lo que sigue en el binario.

## Exploits de seguridad

El código de operación NOP se puede usar para formar una slice NOP, que permite que el código se ejecute cuando el valor exacto del puntero de instrucción es indeterminado (por ejemplo, cuando un desbordamiento de búfer hace que se sobrescriba la dirección de retorno de una función en la pila) .

