Une instruction non documentée (en anglais, undocumented instruction ou illegal opcode) est une instruction-machine destinée à une unité centrale qui n'est pas mentionnée dans une documentation officielle publiée par le concepteur ou le fabricant de l'unité centrale, mais qui a néanmoins un effet.
Les instructions non documentées étaient courantes sur les anciens processeurs conçus dans les années 1970, tels que le MOS Technology 6502, l'Intel 8086 et le Zilog Z80. Sur ces anciens processeurs, plusieurs instructions non documentées sont des effets secondaires du câblage des transistors dans l'unité centrale, et combinent généralement des fonctions de l'unité centrale qui n'étaient pas destinées à être combinées.
Elles incluent la simplification du décodage des instructions par le processeur où certains bits du code d'instruction peuvent être ignorés.
Les instructions concernées ont alors plusieurs codes possibles (des alias non officiels), mais un seul d'entre eux est officiellement documenté.
Sur les processeurs anciens et modernes, il existe également des instructions intentionnellement incluses dans le processeur par le fabricant, mais qui ne sont documentées dans aucune documentation officielle.
Certains programmes se servent d'instructions non documentées pour détecter la révision exacte du processeur.
Fonctionnement
Si la plupart des instructions non documentées accidentelles ont des effets inutiles, voire hautement indésirables (comme le plantage de l'ordinateur), quelques-unes peuvent, par accident, faire quelque chose qui peut être utile dans certaines situations. De telles instructions ont parfois été exploitées dans les jeux sur ordinateur personnel des années 1970 et 1980 pour accélérer certaines opérations critiques. Ces instructions ont également été utilisées dans la lutte permanente entre la mise en œuvre de la protection contre la copie et le craquage. Dans ce cas, elles constituaient une forme de sécurité par l'obscurité et leur secret ne durait généralement pas très longtemps.
Un danger associé à l'utilisation d'instructions non documentées était que, étant donné que le fabricant ne garantit pas leur existence et leur fonctionnement, elles pouvaient disparaître ou se comporter différemment lors de tout changement du processeur ou de toute nouvelle révision du processeur, rendant les programmes qui les utilisaient incompatibles avec les nouveaux processeurs. Par exemple, un certain nombre de jeux Apple II ne fonctionnaient pas correctement sur le Apple IIc parce que ce dernier utilisait une révision différente du processeur (le processeur WDC 65C02 (en)) qui ne supportait plus certaines instructions non documentées.
Les processeurs plus récents, tels que les Intel 80186, Intel 80286, Motorola 68000 et leurs descendants ou le processeur PowerPC, ne possèdent pas d'instructions non documentées largement connues/utilisées. Leurs fabricants garantissent que l'unité centrale se comportera de manière bien définie lorsqu'elle rencontre un code d'opération inconnu : généralement, le code inconnu déclenche une condition d'erreur que le système d'exploitation traite en mettant fin à l'application qui a causé la condition.
Une autre façon, moins courante, de traiter les instructions non documentées consiste à les définir comme ne faisant rien d'autre que de prendre du temps et de l'espace (équivalent de l'instruction nulle). Cette méthode est utilisée par les processeurs Texas Instruments TMS9900 (en) et WDC 65C02 (en), entre autres. Il est également possible d'émuler des instructions non documentées dans un logiciel (par exemple, l'instruction non documentée LOADALL (en)), ou même d'implémenter de nouvelles pseudo-instructions. Certains BIOS, gestionnaires de mémoire et systèmes d'exploitation en profitent, par exemple pour laisser les tâches v86 communiquer avec le système sous-jacent ("bop").
Malgré la garantie des fabricants qu'il n'existe plus d'instructions non documentées, la recherche utilisant des techniques telles que le fuzzing a permis de découvrir un grand nombre d'instructions non documentées dans les processeurs x86 modernes[1]. Certaines de ces instructions sont partagées entre les fabricants de processeurs, ce qui indique qu'Intel et AMD sont tous deux au courant de l'instruction et de son but, bien que l'instruction ne figure dans aucune documentation officielle. D'autres instructions sont spécifiques à des fabricants ou à des gammes de produits spécifiques. L'objectif de la majorité des instructions x86 non documentées est inconnu.
Aujourd'hui, les détails du fonctionnement des instructions non documentées sont surtout intéressants pour permettre une émulation exacte des anciens systèmes.
Références