stringtranslate.com

NOP (código)

En informática , un NOP , no-op o NOOP (pronunciado "no op"; abreviatura de no operación ) es una instrucción en lenguaje de máquina y su mnemónico en lenguaje ensamblador , declaración en lenguaje de programación o 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 una cantidad bien definida de ciclos de reloj para ejecutarse. En otros conjuntos de instrucciones, no hay una instrucción NOP explícita, pero el mnemotécnico del lenguaje ensamblador NOP representa una instrucción que actúa como un NOP; por ejemplo, en SPARC , sethi 0, %g0.

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

Un NOP se usa más comúnmente con fines de temporización, para forzar la alineación de la memoria , para evitar peligros , para ocupar una ranura de retardo de rama , para anular una instrucción existente como un salto, como objetivo de una instrucción de ejecución o como lugar- El titular 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 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 canalización . [1]

A continuación se enumeran 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 están diseñadas para devolver ceros; Dado que el comportamiento de diapositiva NOP suele ser deseable, se tiende a codificarlo con el código de operación de todos ceros.

Código

Una función o secuencia de declaraciones del lenguaje de programación es una declaración NOP o nula si no tiene ningún efecto. La sintaxis de algunos idiomas puede requerir declaraciones nulas en determinados contextos.

ada

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

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 (declaración compuesta) también es un NOP y puede ser más legible:

 {}

En algunos casos, como el cuerpo de una función, se debe utilizar 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 declaraciones compuestas están encerradas entre {} (llaves), que no necesitan un punto y coma a continuación. Por lo tanto, en contextos donde se requiere gramaticalmente una declaración, se puede utilizar alguna declaración nula.

La declaració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 más brevemente:

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

(tenga en cuenta que la última forma puede resultar confusa y, como tal, genera una advertencia con algunos compiladores u opciones del compilador, ya que el punto y coma generalmente indica el final de la 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 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 CONTINUEdeclaració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:

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

const noop = () => {};     

angularjs

El marco 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. [12]

Lodash

La biblioteca Lodash_.noop() proporciona una función que devuelve indefinido y no hace nada. [13]

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 lenguaje, en un bloque BEGIN/END, el punto y coma es opcional antes de la declaración END, por lo que un punto y coma utilizado allí es superfluo.

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

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 una 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 passcuando debería estar vacío.

Secuencias de comandos de Shell (bash, zsh, etc.)

El :comando ' ' [dos puntos] es un comando integrado en el shell que tiene un efecto similar a un "NOP" (una operación que no hace 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). [14] [15] [16]

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

El lenguaje de macros del sistema tipográfico TeX\relax tiene el comando. [17] No hace nada por sí solo, pero puede usarse para evitar que el comando inmediatamente anterior analice los tokens posteriores. [18]

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

Tenga en cuenta que, a diferencia de los otros protocolos enumerados, el comando IMAP4 NOOP tiene un propósito específico: permite al servidor enviar 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 ftpddemonio de MINIX responde a NOOP con el mensaje: [19]

¡ 200 NOOP para ti también!

Agrietamiento

Los NOP a menudo participan al descifrar software que verifica números de serie, requisitos específicos de hardware o software, presencia o ausencia de dongles de hardware , etc. en forma de diapositiva NOP . Este proceso se logra modificando funciones y subrutinas para evitar los controles de seguridad y, en su lugar, simplemente devolver el valor esperado que se está verificando. Debido a que la mayoría de las instrucciones en la rutina de verificación de seguridad no se usarán, estas se reemplazarían 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 utilizar para formar una diapositiva 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 del búfer provoca que se sobrescriba la dirección de retorno de una función en la pila).

Ver también

Referencias

  1. ^ ab "Manual de referencia del programador Motorola 68000" (PDF) .
  2. ^ "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32: referencia del conjunto de instrucciones AZ" (PDF) . Consultado el 1 de marzo de 2012 .
  3. ^ AMD, Manual del usuario del microprocesador Am29050, 1991, páginas 223 y 257.
  4. ^ "4.8.4. Pseudoinstrucción NOP ARM". Herramientas de compilación RealView para la guía del ensamblador BREW .
  5. ^ "5.6.3. Pseudoinstrucción NOP Thumb". Herramientas de compilación RealView para la guía del ensamblador BREW .
  6. ^ ab Hewlett-Packard, Arquitectura PA-RISC 2.0, 1995, páginas 2-21 y 7-103. Archivado el 21 de junio de 2020.
  7. ^ Fundación RISC-V, Manual del conjunto de instrucciones RISC-V, Volumen 1: ISA a nivel de usuario, versión 2.2, 7 de mayo de 2017, p.79.
  8. ^ Tejedor, DL; Germond, T., eds. (1994). Manual de arquitectura SPARC, versión 9 (PDF) . 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.
  9. ^ Manual de referencia de Ada: declaraciones nulas. "La ejecución de una declaración nula no tiene ningún efecto".
  10. ^ 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 lo requiere".
  11. ^ Especificación del lenguaje ECMAScript - Edición 5.1 - Propiedades del objeto prototipo de función
  12. ^ jQuery.noop() de la documentación de la API de jQuery
  13. ^ "Documentación de Lodash". lodash.com . Consultado el 15 de diciembre de 2017 .
  14. ^ Guía avanzada de secuencias de comandos Bash > Capítulo 3. Caracteres especiales
  15. ^ página de manual de bash > COMANDOS INTEGRADOS DE SHELL
  16. ^ página de manual de zsh (zshbuiltins)> COMANDOS INTEGRADOS DE SHELL
  17. ^ Bausum, David (2002). "Secuencias de control primitivas 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 encuentra . En realidad, puede decirle a TeX: "Este es el final de lo que has estado haciendo".\relax\relax
  18. ^ Wikilibro TeX - relájate
  19. ^ "ftpd.c" . Consultado el 19 de junio de 2016 .