Un código de operación ilegal , también llamado operación no implementada , [1] código de operación no deseado [2] o instrucción no documentada , es una instrucción para una CPU que no se menciona en ninguna documentación oficial publicada por el diseñador o fabricante de la CPU, que sin embargo tiene un efecto. Los códigos de operación ilegales eran comunes en CPU más antiguas diseñadas durante la década de 1970, como MOS Technology 6502 , Intel 8086 y Zilog Z80 . En estos procesadores más antiguos, muchos existen como efecto secundario del cableado de los transistores en la CPU y, por lo general, combinan funciones de la CPU que no estaban destinadas a combinarse. En los procesadores antiguos y modernos, también hay instrucciones incluidas intencionalmente en el procesador por parte del fabricante, pero que no están documentadas en ninguna especificación oficial.
El efecto de muchos códigos de operación ilegales, en muchos procesadores, es sólo una trampa para un controlador de errores. Sin embargo, algunos procesadores que detectan la mayoría de los códigos de operación ilegales no lo hacen para algunos códigos de operación ilegales y algunos otros procesadores no verifican los códigos de operación ilegales y, en cambio, realizan una operación no documentada.
Si bien la mayoría de las instrucciones ilegales accidentales tienen efectos inútiles o incluso muy indeseables (como bloquear la computadora), algunas pueden tener funciones útiles en determinadas situaciones. En ocasiones, estas instrucciones se aprovecharon en los juegos de ordenador de las décadas de 1970 y 1980 para acelerar ciertas secciones en las que el tiempo era crítico. Otro uso común fue en la batalla en curso entre las implementaciones de protección contra copia y el cracking . Aquí, eran una forma de seguridad a través de la oscuridad , y su secreto normalmente no duraba mucho.
Un peligro asociado al uso de instrucciones ilegales era que, dado que el fabricante no garantiza su existencia y funcionamiento, podrían desaparecer o comportarse de manera diferente con cualquier cambio en el interior de la CPU o cualquier nueva revisión de la CPU, generando programas que Úselos incompatibles con las revisiones más recientes. Por ejemplo, varios juegos antiguos de Apple II no funcionaban correctamente en el nuevo Apple IIc , porque este último usaba una revisión de CPU más nueva ( 65C02 ) que eliminaba los códigos de operación ilegales.
Las CPU más recientes, como 80186 , 80286 , 68000 y sus descendientes, no tienen códigos de operación ilegales que sean ampliamente conocidos/utilizados. Idealmente, la CPU se comportará de una manera bien definida cuando encuentre un código de operación desconocido en el flujo de instrucciones, como desencadenar una determinada excepción o condición de falla . El controlador de excepciones o fallas del sistema operativo generalmente terminará la aplicación que causó la falla, a menos que el programa haya establecido previamente su propio controlador de excepciones/fallas, en cuyo caso ese controlador recibiría el control. Otra forma menos común de manejar instrucciones ilegales es definiéndolas para que no hagan nada más que ocupar tiempo y espacio (equivalente a la instrucción NOP oficial de la CPU); este método lo utilizan los procesadores TMS9900 y 65C02 , entre otros.Alternativamente, se pueden emular instrucciones desconocidas en el software (por ejemplo, LOADALL ), o incluso se pueden implementar pseudoinstrucciones "nuevas". Algunos BIOS , administradores de memoria y sistemas operativos aprovechan esto, por ejemplo, para permitir que las tareas V86 se comuniquen con el sistema subyacente, es decir, BOP (de "Operación del BIOS") utilizado por Windows NTVDM . [3]
A pesar de la garantía de Intel contra tales instrucciones, la investigación que utilizó técnicas como la fuzzing descubrió una gran cantidad de instrucciones no documentadas en procesadores x86 en fecha tan tardía como 2018. [4] Algunas de estas instrucciones se comparten entre los fabricantes de procesadores, lo que indica que tanto Intel como AMD consciente de la instrucción y su finalidad, a pesar de que no aparezca en ninguna especificación oficial. Otras instrucciones son específicas de fabricantes o líneas de productos específicas. Se desconoce el propósito de la mayoría de las instrucciones x86 no documentadas.
Hoy en día, los detalles de estas instrucciones son de interés principalmente para la emulación exacta de sistemas más antiguos.