En ciencias de la computación , un NOP , no-op o NOOP (pronunciado "no op"; abreviatura de ninguna operación ) es una instrucción en lenguaje ensamblador , una declaración de lenguaje de programación o un comando de protocolo de computadora que no hace nada.
Instrucciones en lenguaje de máquina
Algunos conjuntos de instrucciones de computadora incluyen una instrucción cuyo propósito explícito es no cambiar el estado de ninguno de los registros , indicadores de estado o memoria accesibles al programador . A menudo, se necesita un número bien definido de ciclos de reloj para ejecutarse. En otros conjuntos de instrucciones, se puede simular un NOP ejecutando una instrucción que tenga operandos que causen el mismo efecto; por ejemplo, en el procesador SPARC , la instrucción sethi 0, %g0
es la solución recomendada.
Un NOP se usa más comúnmente para propósitos de cronometraje, para forzar la alineación de la memoria , para prevenir peligros , para ocupar una ranura de retardo de bifurcación , para anular una instrucción existente como un salto, o como un marcador de posición para ser reemplazado 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 llevaría 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 de la tubería . [1]
A continuación se enumeran las instrucciones NOP para algunas arquitecturas de CPU:
Arquitectura de la CPU | Instrucción mnemotécnica | Bytes | Código de operación | Notas |
---|---|---|---|---|
Familia de CPU Intel x86 | NOP | 1; 1–9 para i686 y x86-64 | 0x 90 [2] | 0x90 decodifica xchg eax, eax en todos los modos excepto el modo largo , donde el código de operación 0x90 aún no tiene ningún efecto. Las codificaciones más largas se describen en el manual de Intel. |
Familia Intel 8051 / MCS-51 | NOP | 1 | 0x00 | |
BRAZO A32 | NOP | 4 | 0x00000000 | Esto significa andeq r0, r0, r0 . Lo más probable es que la instrucción de ensamblaje nop se expanda a mov r0, r0 que está codificado como 0xE1A00000 (arquitectura little-endian). [3] |
BRAZO T32 (16 bits) | NOP | 2 | 0xb000 | Código de operación para ADD SP, # 0 : agregue cero al puntero de la pila (sin operación). Lo más probable es que la instrucción de ensamblaje nop se expanda a mov r8, r8, que está codificado como 0x46C0. [4] |
BRAZO T32 (32 bits) | NOP | 4 | 0xF3AF 8000 | |
BRAZO A64 (64 bits) | 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 bits. | El NOP ("No-Op") y NOPR ("Registro No-Op") 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 a probar como igual, no igual, alto, bajo, etc. Si la máscara es 0, no hay rama ocurre. En el caso de la instrucción NOPR, el segundo valor en el segundo byte es el registro en el que se ramifica. 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 un registro base combinado, registro de desplazamiento y dirección de desplazamiento. Si el registro base también es 0, la rama no se toma independientemente del valor del registro de desplazamiento o la dirección de desplazamiento. |
NOPR | 2 | 0x0700 o 0x070n o 0x07n0 donde "n" es cualquier valor de 4 bits. | ||
SuperH | NOP | 2 | 0x0009 | |
MIPS | NOP | 4 | 0x00000000 | Significa sll r0,r0,0 , que significa: cambio Lógicamente el registro 0 bits cero a la izquierda y almacenar el resultado en el registro 0 |
MIPS-X | NOP | 4 | 0x60000019 | (código de operación extendido para add r0,r0,r0 ) |
MEZCLA | NOP | 1 palabra | ± * * * * 0 | Los * bytes son arbitrarios y pueden ser desde 0 hasta el byte máximo (requerido para estar en el rango 63-99). MIX usa representación de magnitud de signo. |
MMIX | SWYM | 4 | 0xFD ****** | SWYM significa "Simpatice con su maquinaria". Los * dígitos se pueden elegir arbitrariamente. |
Familia Motorola 68000 | NOP | 2 | 0x4E71 | Esto sincroniza la canalización y evita la superposición de instrucciones. [1] |
Motorola 6809 | NOP | 1 | 0x12 | |
Tecnología MOS 65xx (por ejemplo, 6502 ) | NOP | 1 | 0xEA | NOP consume dos ciclos de reloj. Los códigos de operación no definidosen lasversiones 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 | (código de operación 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 | Significa sethi 0, %g0 que pone a cero el %g0 registro cableado a cero [5] |
Z80 | NOP | 1 | 0x00 | Hay algunas otras instrucciones sin ningún efecto (y la misma temporización): LD A, A , LD B, B etc. |
PDP-11 | NOP | 16 bits | 000240 (octal) | No borre ninguno de los códigos de condición |
VAX | NOP | 1 | 0x01 | El retraso depende del tipo de procesador |
Desde el punto de vista del diseño de hardware, las áreas no mapeadas de un bus suelen estar diseñadas para devolver ceros; dado que el comportamiento de deslizamiento NOP a menudo es deseable, da un sesgo a la codificación con el código de operación de todos ceros.
Código
NOP se usa a veces como una descripción de la acción realizada por una función o una secuencia de declaraciones del lenguaje de programación si la función o el código no tiene ningún efecto (también podría llamarse código redundante ). Una optimización común del compilador es la detección y eliminación de este tipo de código . Dicho código puede ser requerido por la gramática del lenguaje de programación, que no permite espacios en blanco.
Ada
En Ada , la null
declaración sirve como NOP. [6] Como la sintaxis prohíbe que las sentencias o funciones de control estén vacías, la null
sentencia debe usarse para especificar que no se requiere ninguna acción. (Por lo tanto, si el programador se olvida de escribir una secuencia de declaraciones, el programa no podrá compilar).
C y derivados
La segunda línea a continuación es un ejemplo de una sola declaración de C que se comporta como un NOP. En la práctica, la mayoría de los compiladores no generarán código para esta declaración:
int i = 0; i + 1;
Esta declaración realiza una suma y descarta el resultado. De hecho, cualquier declaración sin efectos secundarios (y que no afecte el flujo de control, por ejemplo, ruptura, retorno) puede eliminarse, ya que se descarta el resultado del cálculo.
La declaración más simple posible en C que se comporta como un NOP es la llamada declaración nula , que es solo un punto y coma en un contexto que requiere una declaración. (No se requiere que un compilador genere una instrucción NOP en este caso; por lo general, no se generaría ninguna instrucción).
;
Alternativamente, se puede usar un bloque vacío (declaración compuesta) y puede ser más legible:
{}
En algunos casos, como el cuerpo de una función, se debe utilizar un bloque, pero puede estar vacío. En C, las declaraciones no pueden estar vacías; las declaraciones simples deben terminar con a; (punto y coma), mientras que las sentencias compuestas están encerradas entre {} (llaves), lo que en sí mismo no necesita un punto y coma siguiente. Por lo tanto, en contextos donde se requiere gramaticalmente una declaración, se puede usar alguna declaración nula.
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 más brevemente:
while ( getchar () ! = '\ n' );
(tenga en cuenta que la última forma puede ser confusa y, como tal, genera una advertencia con algunos compiladores o opciones del compilador, ya que el punto y coma generalmente indica un fin de instrucción de llamada 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 adelantando la ubicación de lectura actual de la entrada estándar al comienzo de la siguiente línea.
Fortran
En Fortran , la CONTINUE
declaración 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. Son posibles muchas implementaciones:
- Utilice la '
;
' instrucción vacía [7] o la '{}
' instrucción de bloque vacío de la misma manera que en los ejemplos de C y derivadas ; - Utilice
undefined
o lanull
expresión como una declaración completa (una declaración de expresión ) cuando la sintaxis no permita los métodos anteriores.
Las alternativas, en situaciones en las que se requiere una función, son:
- Utilice la
Function.prototype()
función incorporada, que acepta cualquier argumento y devuelveundefined
; [8] - Utilice una función NOP disponible en una biblioteca de terceros, consulte a continuación;
- Defina una función NOP personalizada, como en el siguiente ejemplo (utilizando la sintaxis de la función de flecha ES6 ):
const noop = () => {};
AngularJS
El marco 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. [9]
Lodash
La biblioteca Lodash proporciona una función _.noop()
, que devuelve undefined y no hace nada. [10]
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 un punto y coma usado allí es superfluo.
Además, un bloque que consta de BEGIN END;
se puede utilizar como marcador de posición para indicar que no hay acción, incluso si se coloca dentro de otro bloque BEGIN / END.
Pitón
El lenguaje de programación Python tiene una passdeclaración que no tiene ningún efecto cuando se ejecuta y, por lo tanto, sirve como 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.
Secuencias de comandos de shell (bash, zsh, etc.)
El :
comando ' ' [dos puntos] es un comando interno de shell que tiene un efecto similar a un "NOP" (una operación de no hacer nada). Técnicamente no es un NOP, ya que cambia el parámetro especial $? (estado de salida del último comando) a 0. Puede considerarse 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.)
El lenguaje de macros del sistema tipográfico TeX tiene el \relax
comando. [14] No hace nada por sí mismo, pero puede usarse para evitar que el comando inmediatamente anterior analice los tokens posteriores. [15]
Comandos del protocolo NOP
Muchos protocolos informáticos , 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 utilizar para garantizar que la conexión siga 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
- dedo
- 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 notificaciones pendientes 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 extravagantes al cliente. Por ejemplo, el ftpd
demonio de MINIX responde a NOOP con el mensaje: [16]
¡200 NOOP para ti también!
Agrietamiento
Los NOP a menudo están involucrados al descifrar software 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 logra alterando funciones y subrutinas para evitar los controles de seguridad y, en su lugar, simplemente devuelve 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 utilizarán, se reemplazarán con NOP, eliminando así la funcionalidad de seguridad del software sin alterar la posición de todo lo que sigue en el binario.
Explotaciones de seguridad
El código de operación NOP se puede usar para formar una diapositiva NOP , que permite que el código se ejecute cuando el valor exacto del puntero de la instrucción es indeterminado (por ejemplo, cuando un desbordamiento del búfer provoca que se sobrescriba la dirección de retorno de una función en la pila).
Ver también
- Arquitectura de Computadores
- HLT (instrucción x86)
- Función de identidad : la programación funcional equivalente a NOOP
- xyzzy (comando) : un comando que a veces se usa en lugar de NOOP
- IEFBR14
- Texto de relleno
- Comentario (programación de computadoras) : anotaciones generalmente para programadores que son ignoradas por compiladores e intérpretes
Referencias
- ^ a b "Manual de referencia del programador de Motorola 68000" (PDF) .
- ^ "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32: referencia de conjunto de instrucciones AZ" (PDF) . Consultado el 1 de marzo de 2012 .
- ^ "4.8.4. Seudoinstrucción NOP ARM" . Herramientas de compilación RealView para BREW Assembler Guide .
- ^ "5.6.3. Pseudoinstrucción NOP Thumb" . Herramientas de compilación RealView para BREW Assembler Guide .
- ^ Weaver, DL; Germond, T., eds. (1994). Manual de arquitectura SPARC, versión 9 (PDF) . SPARC International, Inc . Prentice Hall . ISBN 0-13-825001-4. Archivado desde el original (PDF) el 18 de enero de 2012 . Consultado el 9 de enero de 2014 .
Tenga en cuenta que NOP es un caso especial de la instrucción SETHI, con imm22 = 0 y rd = 0.
- ^ Manual de referencia de Ada - declaraciones nulas . "La ejecución de un null_statement no tiene ningún efecto".
- ^ Referencia de JavaScript de MDN: declaración vacía . "La declaración vacía es un punto y coma (
;
) que indica que no se ejecutará ninguna declaración, incluso si la sintaxis de JavaScript requiere una". - ^ Especificación del lenguaje ECMAScript - Edición 5.1 - Propiedades del objeto de prototipo de función
- ^ jQuery.noop () de la documentación de la API de jQuery
- ^ "Documentación de Lodash" . lodash.com . Consultado el 15 de diciembre de 2017 .
- ^ Guía avanzada de Bash-Scripting> Capítulo 3. Caracteres especiales
- ^ página de manual de bash> COMANDOS INTEGRADOS DE SHELL
- ^ página de manual de zsh (zshbuiltins)> COMANDOS INTEGRADOS DE SHELL
- ^ Bausum, David (2002). "Secuencias de control primitivo TeX". Manual de referencia de TeX . Editores académicos de Kluwer . Consultado el 1 de abril de 2020 .
Según The TeXbook, 'TeX no hace nada' cuando se encuentra
\relax
. De hecho,\relax
puede decirle a TeX: "Este es el final de lo que has estado haciendo". - ^ Wikibook de TeX - relájate
- ^ "ftpd.c" . Consultado el 19 de junio de 2016 .