NOP (código)

Machine instruction that indicates to a computer to do nothing

En informática , un NOP , no-op o NOOP (pronunciado "no op"; abreviatura de no operación ) es una instrucción en lenguaje 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 accesibles para el programador , indicadores de estado o memoria . 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 mnemónico del lenguaje ensamblador NOP representa una instrucción que actúa como NOP; por ejemplo, en SPARC , sethi 0, %g0.

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

Un NOP se utiliza con mayor frecuencia para fines de sincronización, para forzar la alineación de la memoria , para prevenir peligros , para ocupar una ranura de retardo de bifurcación , para dejar sin efecto una instrucción existente como un salto, como objetivo de una instrucción de ejecución o como un marcador de posición para 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 demandarí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 CPUMnemotécnico de instrucciónBytesCódigo de operaciónNotas
Familia de CPU Intel x86 NOP10x90 [2]0x90 es la codificación de un byte para XCHG AX,AXcódigos de 16 bits y XCHG EAX,EAXde 32 bits. En modo largo, XCHG RAX,RAXrequiere dos bytes, ya que comenzaría con un REX.Wprefijo, lo que hace que la codificación 0x48 sea 0x90. Sin embargo, 0x90 se interpreta como NOPen modo largo independientemente de si está precedido por 0x48. [2]
multibyteNOP2–9 para procesadores Intel Pentium Pro y posteriores, y todos los procesadores AMD AMD640x66 0x90

0x0F 0x1F 0x00

0x0F 0x1F 0x40 0x00

0x0F 0x1F 0x44 0x00 0x00

0x66 0x0F 0x1F 0x44 0x00 0x00

0x0F 0x1F 0x80 0x00 0x00 0x00 0x00

0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00

0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 [2]

0x66 es el prefijo de anulación del tamaño del operando. 0x0F 0x1F es un código de operación NOP de dos bytes que toma un operando ModRM sobre el cual no se realiza ninguna operación; 0x00 es [EAX], 0x40 0x00 es [EAX + 00H], 0x44 0x00 0x00 es [EAX + EAX*1 + 00H], 0x80 0x00 0x00 0x00 0x00 es [EAX + 00000000H], y 0x84 0x00 0x00 0x00 0x00 0x00 es [EAX + EAX*1 + 00000000H]. [2]
Intel 8008LAA10xC0Cargar A desde A
Familia Intel 8051 / MCS-51NOP10x00
Intel 8080 , Intel 8085 , Z80NOP10x00
DEC AlfaNOP40x47FF041FCódigo de operación para BIS r31,r31,r31, una instrucción que realiza una operación OR bit a bit del registro que siempre es 0 consigo mismo.
AMD 29kNOP40x70400101Código de operación para aseq 0x40,gr1,gr1, una instrucción que afirma que el registro de pila es igual a sí mismo. [3]
BRAZO A32NOP40x00000000Esto significa andeq r0, r0, r0. Lo más probable es que la instrucción de ensamblaje nopse expanda a mov r0, r0lo que está codificado como 0xE1A00000 (arquitectura little-endian). [4]
ARM T32 (16 bits)NOP20xb000Código de operación para ADD SP, #0: agregar cero al puntero de pila (sin operación). nopLo más probable es que la instrucción de ensamblaje se expanda a mov r8, r8lo que está codificado como 0x46C0. [5]
ARM T32 (32 bits)NOP40xF3AF8000
ARM A64 (64 bits)NOP40xD503201F
AVRNOP20x0000un ciclo de reloj
IBM System/360 , IBM System/370 , IBM System/390 , z/Architecture , Serie UNIVAC 90NOP40x47000000 o 0x470nnnnn o 0x47n0nnnn donde "n" es cualquier valor de 4 bits.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 a probar, como igual, no igual, alto, bajo, etc. Si la máscara es 0, no se produce ninguna bifurcación.

En el caso de la instrucción NOPR, el segundo valor del segundo byte es el registro en el que se realizará la bifurcación. Si se elige el registro 0, no se realizará ninguna bifurcación independientemente del valor de la máscara. Por lo tanto, si alguno de los dos valores del segundo byte es 0, no se realizará la bifurcación.

En el caso de la instrucción NOP, el segundo valor del segundo byte es el registro "base" de un registro base combinado, un registro de desplazamiento y una dirección de desplazamiento. Si el registro base también es 0, no se realiza la bifurcación independientemente del valor del registro de desplazamiento o de la dirección de desplazamiento.

NOPR20x0700 o 0x070n o 0x07n0 donde "n" es cualquier valor de 4 bits.
Súper HNOP20x0009
MIPSNOP40x00000000Significa sll r0,r0,0, lo que significa: desplaza lógicamente los bits cero del registro 0 hacia la izquierda y almacena el resultado en el registro 0. Las escrituras en el registro 0 se ignoran; siempre contiene 0.
MIPS-XNOP40x60000019(código de operación extendido para add r0,r0,r0)
MEZCLANOP1 palabra± * * * * 0Los bytes * son arbitrarios y pueden ser cualquier valor entre 0 y el byte máximo (que debe estar en el rango de 63 a 99). MIX utiliza la representación de signo-magnitud.
MMIXSWYM40xFD******SWYM significa "Sympathize with your machinery" (simpatizar con su maquinaria). Los dígitos * pueden elegirse arbitrariamente.
Motorola 6800NOP10x01
Familia Motorola 68000NOP20x4E71Esto sincroniza la canalización y evita la superposición de instrucciones. [1]
Motorola 6809NOP10x12
Tecnología MOS 65xx (por ejemplo, 6502 )NOP10xEANOPconsume dos ciclos de reloj. Los códigos de operación no definidos en las versiones NMOS de la familia 65xx se convirtieron en NOP de longitudes de instrucción y tiempos de ciclo variables en el 65C02 .
PA-RISCNOP40x08000240Código de operación para OR 0,0,0. [6]
LDI 26,040x34000034NOP palindrómico: es decir, una instrucción que se ejecuta como NOP independientemente de si el orden de bytes se interpreta como little-endian o big-endian . Algunas instrucciones del sistema PA-RISC deben ir seguidas de siete NOP palindrómicos. [6]
PC de potenciaNOP40x60000000(código de operación extendido para ori r0,r0,0)
Microcontrolador PICNOP12 bits0b000000000000
RISC-VNOP40x00000013ADDI x0, x0, 0
C.NOP20x0001C.ADDI x0, 0. Sólo disponible en CPU RISC-V que admitan la extensión "C" (instrucciones comprimidas). [7]
Señalética 8X300MOV AUX, AUX16 bits0x0000Mueva AUX a AUX sin rotar
SPARCNOP40x01000000Significa que pone a cero el registro sethi 0, %g0cableado a cero [8]%g0
PDP-10JFCL 0,(convencional)
JUMP, SETA, SETAI, CAI, TRN, TLN
1 palabra25500******* (octal)No saltes nunca. No
saltes nunca, no fijes nada, no te saltes nunca.
PDP-11NOP2000240 (octal)No borre ninguno de los códigos de condición
vacunaNOP10x01El retraso depende del tipo de procesador
WD16NOP20x0000

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 deslizamiento NOP es a menudo deseable, esto genera una tendencia a codificarlo con el código de operación de todos ceros.

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 efecto. La sintaxis de algunos lenguajes puede requerir instrucciones nulas en determinados contextos.

Ada

En Ada , la nulldeclaración funciona como un 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 simplemente un punto y coma en un contexto que requiere una declaración.

La mayoría de los compiladores de C no generan código para declaraciones nulas, lo que tiene razones históricas y de rendimiento.

  ;

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

 {}

En algunos casos, como en 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 un ;(punto y coma), mientras que las declaraciones compuestas se encierran entre {}(llaves), que no necesitan un punto y coma posterior. Por lo tanto, en contextos en los que se requiere una declaración gramaticalmente, se puede utilizar alguna declaración nula de este tipo.

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:

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

alternativamente,

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

o más concisamente:

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

(tenga en cuenta que la última forma puede ser 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 una 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 \ncarácter (de nueva línea), esencialmente adelantando 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 utiliza en algunos contextos, como la última declaración en un bucle DO, aunque se puede utilizar 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 ; declaración vacía [10] o la declaración de bloque{} vacío de la misma manera que en los ejemplos de C y derivados;
  • Utilice la expresión undefinedo nullcomo una declaración completa (una declaración de expresión ) cuando la sintaxis no permite los métodos anteriores.

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

  • Utilice la Function.prototype()función incorporada, que acepta cualquier argumento y devuelve undefined; [11]
  • 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 función de flecha ES6 ):
constante noop = () => {};     

AngularJS

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

jQuery

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

Lodash

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

Pascal

Al igual que en C, el ; utilizado por sí solo puede utilizarse como una sentencia 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 sentencia END, por lo que el uso de un punto y coma en ese caso es superfluo.

Además, un bloque que consta de 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 passdeclaración que no tiene efecto cuando se ejecuta y, por lo tanto, funciona como una 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.

Scripts de shell (bash, zsh, etc.)

El :comando ' ' [dos puntos] es una instrucción incorporada 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 de la instrucción incorporada del shell 'true', 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 tiene el \relaxcomando. [17] No hace nada por sí mismo, pero puede usarse para evitar que el comando inmediatamente anterior analice cualquier token posterior. [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 sigue activa o que el servidor responde. Un comando NOOP forma 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 cualquier notificación pendiente al cliente.

Aunque 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: [19]

¡200 NOOP para ti también!

Agrietamiento

Los NOP suelen estar involucrados cuando se descifra software que verifica números de serie, requisitos específicos de hardware o software, presencia o ausencia de llaves de hardware , etc. en forma de una diapositiva NOP . Este proceso se logra modificando funciones y subrutinas para eludir 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 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.

Explosiones 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 de búfer hace que se sobrescriba la dirección de retorno de una función en la pila).

Véase también

Referencias

  1. ^ ab "Manual de referencia del programador de Motorola 68000" (PDF) .
  2. ^ abcd "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32: Referencia de conjuntos de instrucciones AZ" . 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". Guía de herramientas de compilación RealView para ensamblador BREW .
  5. ^ "5.6.3. Pseudoinstrucción NOP Thumb". Guía de herramientas de compilación de RealView para ensamblador BREW .
  6. ^ de Hewlett-Packard, PA-RISC 2.0 Architecture, 1995, páginas 2-21 y 7-103. Archivado el 21 de junio de 2020.
  7. ^ RISC-V Foundation, The RISC-V Instruction Set Manual, Volumen 1: ISA a nivel de usuario, versión 2.2, 7 de mayo de 2017, pág. 79.
  8. ^ Weaver, 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. Nótese que NOP es un caso especial de la instrucción SETHI, con imm22 = 0 y rd = 0.
  9. ^ Manual de referencia de Ada: sentencias null. "La ejecución de una sentencia null_statement 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 scripts en Bash > Capítulo 3. Caracteres especiales
  15. ^ bash manpage > COMANDOS INTEGRADOS DEL SHELL
  16. ^ Página de manual de zsh (zshbuiltins) > COMANDOS INTEGRADOS DE SHELL
  17. ^ Bausum, David (2002). "TeX Primitive Control Sequences". Manual de referencia de TeX. Kluwer Academic Publishers . 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 de TeX: relájate
  19. ^ "ftpd.c" . Consultado el 19 de junio de 2016 .
Retrieved from "https://en.wikipedia.org/w/index.php?title=NOP_(code)&oldid=1251651924"