Articulo de referencia

NOP (código)

En informática , una NOP , no-op o NOOP (pronunciado "no op"; abreviatura de no operation ) es una instrucción en lenguaje máquina y su mnemónico en lenguaje ensamblador , instr...

En informática , una NOP , no-op o NOOP (pronunciado "no op"; abreviatura de no operation ) es una instrucción en lenguaje máquina y su mnemónico en lenguaje ensamblador , instrucción en lenguaje de programación o comando de protocolo informático que no hace nada.

Instrucciones en lenguaje máquina

Algunos conjuntos de instrucciones de computadora incluyen una instrucción cuyo propósito es no cambiar el estado de ninguno de los registros , indicadores de estado o memoria accesibles por el programador . A menudo requiere un número bien definido de ciclos de reloj para ejecutarse. En algunos conjuntos de instrucciones, no hay una instrucción NOP explícita; el mnemónico del lenguaje ensamblador NOP representa una instrucción regular con parámetros que hacen que no haga nada, como la de SPARCsethi 0, %g0 .

Una instrucción NOP no debe acceder a la memoria, ya que eso podría causar un fallo de memoria o un fallo de página .

Una NOP se usa comúnmente para fines de temporización, para forzar la alineación de memoria , para prevenir riesgos , para ocupar una ranura de retardo de bifurcación , para anular una instrucción existente como un salto, como destino de una instrucción de ejecución o como marcador de posición que será reemplazado por instrucciones activas más adelante en el desarrollo del programa (o para reemplazar instrucciones eliminadas cuando la reorganización sería problemática o consumiría mucho tiempo). En algunos casos, una 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 muestran las instrucciones NOP para algunas arquitecturas de CPU:

Desde el punto de vista del diseño de hardware, las áreas no mapeadas de un bus a menudo se diseñan para devolver ceros; dado que el comportamiento de deslizamiento NOP suele ser deseable, esto genera una tendencia a codificarlo con el código de operación de ceros absolutos.

Código

Una función o una secuencia de instrucciones de un lenguaje de programación es una instrucción NOP o nula si no tiene ningún efecto. En ciertos contextos, la sintaxis de algunos lenguajes puede requerir instrucciones nulas .

Ada

En Ada , la nullinstrucción funciona como una NOP (operación nula). [ 35 ] Dado que la sintaxis prohíbe que las instrucciones de control o las funciones estén vacías, la nullinstrucción debe usarse para especificar que no se requiere ninguna acción. (Por lo tanto, si el programador olvida escribir una secuencia de instrucciones, el programa no compilará).

C y derivados

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

La mayoría de los compiladores de C no generan código para las sentencias nulas, lo cual se debe a razones históricas y de rendimiento.

 ;

Un bloque vacío (instrucción compuesta) también es una instrucción NOP y puede ser más legible, pero aun así el compilador no generará ningún código para él.

 {}

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 sentencias no pueden estar vacías: las sentencias simples deben terminar con un ;punto y coma, mientras que las sentencias compuestas se encierran entre {}llaves, las cuales no requieren un punto y coma posterior. Por lo tanto, en contextos donde se requiere una sentencia gramaticalmente, se puede usar una sentencia vacía.

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

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

alternativamente,

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

o, de forma más concisa:

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

La última forma podría generar una advertencia con algunos compiladores u opciones de compilación, ya que un punto y coma colocado después de un paréntesis al final de una línea generalmente indica el final de una expresión de llamada a función.

El código anterior continúa llamando a la función getchar()hasta que devuelve un \ncarácter (salto de línea), lo que esencialmente acelera la ubicación de lectura actual de la entrada estándar hasta el comienzo de la siguiente línea.

Fortran

En Fortran , la CONTINUEinstrucción se utiliza en algunos contextos, como la última instrucción en un bucle DO, aunque se puede utilizar en cualquier lugar y no tiene ninguna funcionalidad.

JavaScript

El lenguaje JavaScript no tiene una instrucción NOP incorporada. Son posibles muchas implementaciones:

  • Utilice la ;instrucción vacía [ 36 ] o la instrucción de bloque{} vacía de la misma manera que en los ejemplos de C y derivados ;
  • Utilice undefinedla nullexpresión como una instrucción completa (una instrucción de expresión ) cuando los métodos anteriores no estén permitidos por la sintaxis.

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

  • Utilice la Function.prototype()función integrada, que acepta cualquier argumento y devuelve undefined; [ 37 ]
  • Utilice una función NOP disponible en una biblioteca de terceros (véase más abajo);
  • Defina una función NOP personalizada, como en el siguiente ejemplo (utilizando la sintaxis de función flecha de ES6 ):
const noop = () => {};

AngularJS

El framework AngularJS proporciona la función angular.noop , que no realiza ninguna operación.

jQuery

La biblioteca jQueryjQuery.noop() proporciona una función que no hace nada. [ 38 ]

Lodash

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

Pascal

Al igual que en C, el punto y coma  (;) utilizado por sí solo puede usarse como una instrucción nula en Pascal . De hecho, debido a la especificación del lenguaje, en un bloque BEGIN/END, el punto y coma es opcional antes de la instrucción END, por lo que su uso allí resulta superfluo.

Además, un bloque compuesto por BEGIN END;puede usarse 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 passinstrucción que no tiene efecto al ejecutarse y, por lo tanto, funciona como una instrucción NOP (Non-Option). Se utiliza principalmente para garantizar una sintaxis correcta debido a la sensibilidad a la indentación de la sintaxis de Python ; por ejemplo, la sintaxis para la definición de una clase requiere un bloque indentado con la lógica de la clase, que debe expresarse como passcuando debería estar vacío.

Programación de scripts de shell (bash, zsh, etc.)

El :comando ' ' [dos puntos] es un comando interno del shell que tiene un efecto similar a una "NOP" (una operación que no hace nada). Técnicamente no es una NOP, ya que cambia el parámetro especial $? (estado de salida del último comando) a 0. Puede considerarse un sinónimo del comando interno del shell 'true', y su estado de salida es verdadero (0). [ 40 ] [ 41 ] [ 42 ]

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

El lenguaje de macros del sistema tipográfico TeX tiene el \relaxcomando. [ 43 ] No hace nada por sí mismo, pero puede usarse para evitar que el comando inmediatamente anterior analice cualquier token subsiguiente. [ 44 ]

Comandos del protocolo NOP

Muchos protocolos informáticos , como telnet , incluyen un comando NOOP que un cliente puede emitir para solicitar una respuesta del servidor sin solicitar ninguna otra acción. Este comando se puede usar para asegurar que la conexión sigue activa o que el servidor responde. El comando NOOP forma parte de los siguientes protocolos ( esta es una lista parcial ):

A diferencia de los demás protocolos mencionados, el comando IMAP4 NOOP tiene un propósito específico: permite que el servidor envíe al cliente las notificaciones pendientes.

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

¡200 NOOP para ti también!

Agrietamiento

Las instrucciones NOP suelen utilizarse al descifrar software que verifica números de serie, requisitos específicos de hardware o software, presencia o ausencia de dongles de hardware , etc., mediante una secuencia de instrucciones NOP . Este proceso se logra alterando funciones y subrutinas para eludir las comprobaciones de seguridad y, en su lugar, devolver simplemente el valor esperado. Dado que la mayoría de las instrucciones de la rutina de comprobación de seguridad no se utilizan, se reemplazan con instrucciones NOP, eliminando así la funcionalidad de seguridad del software sin alterar la posición de las instrucciones posteriores en el binario.

vulnerabilidades de seguridad

El código de operación NOP se puede utilizar para formar un deslizamiento 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 provoca que se sobrescriba la dirección de retorno de una función en la pila).

Véase también

Referencias

  1. 1 2 3 4 5 Manual de referencia del programador Motorola 68000 (PDF) .
  2. 1 2 3 4 "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32: Referencia del conjunto de instrucciones AZ" . Consultado el 1 de marzo de 2012 .
  3. 1 2 i860 Manual de referencia del programador de microprocesadores de 64 bits (PDF) . Intel. Febrero de 1989. págs. 68, 172. Número de pedido 240329-002. 
  4. Manual del desarrollador del microprocesador i960 Hx ] (PDF) . Intel. Septiembre de 1998. Véase el apéndice B en la pág. 487 y el apéndice C en las págs. 495-497 para la codificación de instrucciones, y el apéndice E.2.7.8 en la pág. 575 para el uso de MOV g0,g0 como NOP de relleno. Número de pedido 272484-002. Archivado del original (PDF) el 15 de abril de 2003.
  5. Manual del desarrollador de software de la arquitectura Intel Itanium, revisión 2.3 (PDF) . Intel. Mayo de 2010. Libro 3, sección 2.2 en la página 1092, sección 4.3.4.1 en la página 1218, sección 4.4.11 en la página 1248, sección 4.5.3.2 en la página 1255, sección 4.6.9.2 en la página 1264 y sección 4.7.4 en la página 1267. Archivado (PDF) del original el 8 de diciembre de 2011.
  6. 1 2 Manual de referencia de la arquitectura ARM, edición ARMv7-A y ARMv7-R . ARM. 29 de marzo de 2018. Sección A8.8.120 en la página 511. ARM DDI 0406C.d. Archivado del original el 27 de septiembre de 2023.
  7. 1 2 Guía de referencia de la versión 2.50 del kit de desarrollo de software ARM . ARM. Noviembre de 1998. Consulte las secciones 5.5.6 y 5.6.4 para obtener información sobre las instrucciones NOP en el lenguaje ensamblador ARM/Thumb. ARM DUI 0041C. Archivado del original el 1 de junio de 2022.
  8. 1 2 "Instrucción NOP" . Referencia del ensamblador de la cadena de herramientas del compilador ARM v5.03 . ARM.{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  9. 1 2 O. Smith (12 de diciembre de 1996). "StrongARM multiplica la velocidad" . Grupo de noticias : comp.sys.arm . Archivado del original el 16 de marzo de 2025. 
  10. Acorn Assembler Release 2 (PDF) . Acorn Computers. Mayo de 1991. MOVNV aparece en la página 218. Archivado (PDF) del original el 25 de octubre de 2018.
  11. Microprocesador RISC ARM610 de 32 bits (PDF) . ARM. Agosto de 1993. pág. 20. ARM DDI 0004D. 
  12. Manual de referencia de la arquitectura ARM (PDF) . ARM. Febrero de 2000. Sección 3.2.1 en la página 69. ARM DDI 0100D. Archivado (PDF) del original el 16 de marzo de 2025.
  13. 1 2 3 Manual de arquitectura Alpha versión 4 (PDF) . Compaq. Octubre de 1998. Véase la sección A.4.4.1 en la pág. 285 para las formas NOP y las secciones 3.3 en la pág. 50 y C.1 en la pág. 303 para las codificaciones de instrucciones. N.º de pedido: EC–QD2KC–TE. Archivado del original (PDF) el 27 de agosto de 2004.
  14. JH Edmondson (abril de 1995). "Ejecución de instrucciones superescalares en el microprocesador Alpha 21164" (PDF) . pág. 6. Archivado (PDF) del original el 5 de enero de 2023. 
  15. Guía del programador en lenguaje ensamblador de UNIX digital (PDF) . Digital. Marzo de 1996. Véase la sección C.7 en la página 219. Número de pedido AA-PS31D-TE. Archivado del original (PDF) el 1 de octubre de 2000.
  16. AMD, "Manual del usuario del microprocesador Am29050" (PDF) . 1991. págs. 223, 257. 
  17. "2. Instrucciones de operación de pila §2-77 NOP Sin operación." Manual de referencia del conjunto de instrucciones de la máquina (PDF) . Sistemas informáticos HP 3000. Hewlett-Packard. Junio ​​de 1984. págs. 2-23 (pág. 50 del PDF). 30000-90022 vía BitSavers. 
  18. Hyperstone Electronics GmbH, Manual del usuario del microprocesador de 32 bits Hyperstone E1-32/E1-16 , rev. 03/96, páginas 35, 38, 70.
  19. "Características funcionales del IBM System/360 Modelo 91" (PDF) . Biblioteca de referencia de sistemas. IBM. pág. 16. Consultado el 17 de enero de 2025 . 
  20. Manual de referencia de LoongArch, volumen 1: arquitectura básica, versión 1.10 (PDF) . Loongson. Sección 2.2.1.10 en la página 23 y apéndice B en la página 190.
  21. AMD/Xilinx, Guía de referencia del procesador MicroBlaze , UG984 (v2021.2), 27 de octubre de 2021, pág. 281
  22. Especificación de diseño del microprocesador de 32 bits MC88110, Revisión 2.0 (PDF) . Motorola. Consulte la sección 2.1.2.3 en la página 11 para ver una lista de las instrucciones NOP recomendadas, y las páginas 10, 170 y 171 para las codificaciones de instrucciones. Archivado (PDF) del original el 19 de marzo de 2025.
  23. Guía del usuario de la familia MSP430F2xx, MSP430G2xx (PDF) . Texas Instruments. Diciembre de 2004. Secciones 3.24 en la página 47, 3.4.5 en la página 63, 3.4.6.33 en la página 98. Archivado (PDF) del original el 1 de septiembre de 2022.
  24. 1 2 Arquitectura PA-RISC 2.0 (PDF) . Hewlett-Packard . 1995. págs. 2–21 , 7–103 . Archivado del original (PDF) el 21 de junio de 2020. 
  25. Power ISA versión 3.1C (PDF) . OpenPOWER Foundation. 26 de mayo de 2024. Libro 1, sección 3.3.13, páginas 97-99; libro 2, sección 3.2, página 987 y sección 4.3.3, página 1005; libro 3, sección 5.4.3, página 1100, sección 9.2.1, página 1244 y sección 11.3, página 1253. Archivado del original (PDF) el 10 de septiembre de 2024.
  26. Manual de programación del motor de banda ancha celular, versión 1.1 (PDF) . IBM. 24 de abril de 2007. Sección 10.6.2.2 en la página 316. Archivado (PDF) del original el 24 de mayo de 2008.
  27. "SCINET Briefing: Compilación para Power6" (PDF) . IBM. Febrero de 2009. Diapositiva 9. Archivado (PDF) del original el 23 de marzo de 2025.
  28. Manual del usuario del procesador POWER8 para el módulo de un solo chip, versión 1.3 (PDF) . IBM . 16 de marzo de 2016. Sección 10.1.8 en la página 209. Archivado (PDF) del original el 28 de diciembre de 2018.
  29. Manual del conjunto de instrucciones RISC-V, volumen 1: ISA de nivel de usuario, versión 2.2 (PDF) . Fundación RISC-V . 7 de mayo de 2017. pág. 79. 
  30. Weaver, DL; Germond, T., eds. (1994). The SPARC Architecture Manual, Versión 9 (PDF) . Prentice Hall . ISBN 0-13-825001-4. Archivado del original (PDF) el 18-01-2012 . Recuperado el 09-01-2014 . Nótese que NOP es un caso especial de la instrucción SETHI, con imm22 = 0 y rd = 0.
  31. "Guía de programación S+core7 v1.4" (PDF) . Sunplus Technology Co. Ltd. 22 de marzo de 2007. págs. 12, 90, 166. Archivado del original (PDF) el 15 de noviembre de 2012. 
  32. Núcleo de CPU SH-5, Volumen 3: SHcompact (PDF) . SuperH Inc. 22 de febrero de 2002. pág. 219. Archivado del original (PDF) el 20 de marzo de 2009. 
  33. Núcleo de CPU SH-5, Volumen 2: SHmedia (PDF) . SuperH Inc. 22 de febrero de 2000. pág. 260. Archivado del original (PDF) el 20 de marzo de 2009. 
  34. Manual de referencia de la arquitectura del conjunto de instrucciones Xtensa (PDF) . Tensilica. Abril de 2010. págs. 459–460 . Archivado (PDF) del original el 5 de marzo de 2016. 
  35. Manual de referencia de Ada . Semántica dinámica. La ejecución de una instrucción null_statement no tiene efecto.
  36. "Instrucción vacía" . Referencia de JavaScript de Mozilla Developer Network . 13 de marzo de 2025. La instrucción vacía es un punto y coma ( ) que indica que no se ejecutará ninguna instrucción, incluso si la sintaxis de JavaScript lo requiere.;
  37. "Propiedades del objeto prototipo de función" . Especificación del lenguaje ECMAScript – Edición 5.1 .
  38. jQuery.noop() de la documentación de la API de jQuery
  39. "Documentación de Lodash" . lodash.com . Consultado el 15 de diciembre de 2017 .
  40. "Capítulo 3. Caracteres especiales" . Guía avanzada de programación en Bash .
  41. página man de bash > COMANDOS INTEGRADOS DE SHELL
  42. Página de manual de zsh (zshbuiltins) > COMANDOS INTEGRADOS DE SHELL
  43. Bausum, David (2002). "Secuencias de control primitivas de TeX". Manual de referencia de TeX . Kluwer Academic Publishers . Recuperado el 1 de abril de 2020. Según The TeXbook, 'TeX no hace nada' cuando encuentra . En realidad, puede decirle a TeX: 'Este es el final de lo que has estado haciendo'.\relax\relax
  44. Wikilibro de TeX – relájate
  45. "ftpd.c" . Consultado el 19 de junio de 2016 .