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 editar

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.[1]

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[2] 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).[3]
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.[4]
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.

NOPR 2 0x0700 o 0x070n o 0x07n0 donde "n" es cualquier valor de 4-bit.
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.[1]
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[5]
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 editar

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 editar

En Ada, la instrucción null sirve como NOP.[6]​ 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 editar

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:

  while (getchar() != '\n') {}

alternativamente,

  while (getchar() != '\n')
      ;

o concretamente:

  while (getchar() != '\n');

(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 editar

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 editar

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

  • Usar el ; declaración vacía[7]​ 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;[8]
  • 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):
const noop = () => {};

AngularJS editar

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

jQuery editar

La biblioteca jQuery proporciona una función jQuery.noop(), que no hace nada.[9]

Lodash editar

La biblioteca Lodash proporciona una función _.noop(), que devuelve indefinido y no hace nada.[10]

Pascal editar

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 editar

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

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).[11][12][13]

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

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

Comandos de protocolo NOP editar

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"):

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:[16]

200 NOOP to you too!

Cracking editar

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. [cita requerida] 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 editar

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

Véase también editar

Referencias editar

  1. a b «Motorola 68000 Programmer's Reference Manual». 
  2. «Intel 64 and IA-32 Architectures Software Developer's Manual: Instruction Set Reference A-Z». Consultado el 1 de marzo de 2012. 
  3. «4.8.4. NOP ARM pseudo-instruction». RealView Compilation Tools for BREW Assembler Guide. 
  4. «5.6.3. NOP Thumb pseudo-instruction». RealView Compilation Tools for BREW Assembler Guide. 
  5. Weaver, D. L.; Germond, T., eds. (1994). «The SPARC Architecture Manual, Version 9». SPARC International, Inc. (Prentice Hall). ISBN 0-13-825001-4. Archivado desde el original el 18 de enero de 2012. Consultado el 9 de enero de 2014. «Note that NOP is a special case of the SETHI instruction, with imm22 = 0 and rd = 0.» 
  6. Ada Reference Manual — null statements. "The execution of a null_statement has no effect."
  7. MDN JavaScript reference – empty statement. "The empty statement is a semicolon (;) indicating that no statement will be executed, even if JavaScript syntax requires one."
  8. ECMAScript Language Specification – Edition 5.1 – Properties of the Function Prototype Object
  9. jQuery.noop() from jQuery API documentation
  10. «Lodash Documentation». lodash.com (en inglés). Consultado el 15 de diciembre de 2017. 
  11. Advanced Bash-Scripting Guide > Chapter 3. Special Characters
  12. bash manpage > SHELL BUILTIN COMMANDS
  13. zsh manpage (zshbuiltins) > SHELL BUILTIN COMMANDS
  14. Bausum, David (2002). «TeX Primitive Control Sequences». TeX Reference Manual. Kluwer Academic Publishers. Consultado el 1 de abril de 2020. «According to The TeXbook, 'TeX does nothing' when it encounters \relax. Actually, \relax may tell TeX, 'This is the end of what you've been doing'.» 
  15. TeX wikibook – relax
  16. «ftpd.c». Consultado el 19 de junio de 2016. 

Enlaces externos editar

.p