
コンピュータサイエンスにおいて、不正オペコード(未実装操作[ 1 ] 、意図しないオペコード[ 2 ]、または文書化されていない命令とも呼ばれる)とは、 CPUの設計者または製造者が公開した公式文書に記載されていないが、効果を持つCPUへの命令のことである。不正オペコードは、 MOS Technology 6502、Intel 8086、Zilog Z80など、1970年代に設計された古いCPUでよく見られた。現代のプロセッサとは異なり、これらの古いプロセッサはトランジスタの予算が非常に限られているため、スペースを節約するために、設計者は無効なオペコードを検出してエラーハンドラへのトラップを生成する回路を省略することが多かった。これらのオペコードの多くは、CPU内のトランジスタの配線の副作用として動作し、通常は組み合わせることを意図していなかったCPUの機能を組み合わせる。古いプロセッサにも新しいプロセッサにも、メーカーが意図的にプロセッサに組み込んだ命令が存在するが、それらは公式の仕様書には記載されていない。
意図せず発生した不正な命令のほとんどは、役に立たない、あるいは(デバイスのクラッシュなど)非常に望ましくない結果をもたらすが、中には特定の状況で有用な機能を発揮するものもある。こうした命令は、 1970年代から1980年代にかけてのコンピュータゲームにおいて、時間的制約の厳しい特定のセクションの処理速度を上げるために悪用されることがあった。また、コピープロテクションの実装とクラッキングとの絶え間ない攻防においても、こうした命令はよく利用された。この場合、不正な命令は一種の「秘匿によるセキュリティ」として機能したが、その秘密性は通常長くは続かなかった。
不正命令の使用に伴う危険性の一つは、製造元がその存在と機能を保証していないため、CPU内部の変更やCPUの新バージョンによって命令が消滅したり、動作が変わったりする可能性があり、それらを使用するプログラムが新しいバージョンと互換性を失ってしまうことである。例えば、古いApple IIのゲームの多くは、新しいApple IIcでは正しく動作しなかった。これは、Apple IIcが不正命令を廃止した新しいCPUバージョン(65C02 )を使用していたためである。
80186、80286、68000などの後継CPUには、広く知られ/使用されている不正なオペコードは存在しません。理想的には、CPUは命令ストリームで未知のオペコードが見つかった場合、特定の例外や障害状態を引き起こすなど、明確に定義された方法で動作します。オペレーティングシステムの例外ハンドラまたは障害ハンドラは、通常、障害を引き起こしたアプリケーションを終了します。ただし、プログラムが事前に独自の例外/障害ハンドラを確立している場合は、そのハンドラが制御を受け取ります。不正な命令を処理するもう1つのあまり一般的ではない方法は、時間とスペースを消費するだけで何も実行しないように定義することです(CPUの公式NOP命令に相当)。この方法は、 TMS9900や65C02プロセッサなどで使用されています。あるいは、未知の命令はソフトウェアでエミュレートすることもできます(例:LOADALL)。また、「新しい」擬似命令を実装することも可能です。一部のBIOS 、メモリマネージャ、およびオペレーティングシステムは、この仕組みを利用しています。例えば、V86タスクが基盤となるシステムと通信できるようにするため、Windows NTVDMで利用されているBOP(「BIOS Operation」の略)などが挙げられます。[ 3 ]
Intel はそのような命令は存在しないと保証しているにもかかわらず、ファジングなどの技術を用いた調査により、2018 年になっても x86 プロセッサには膨大な数の未文書化命令が存在することが明らかになった。 [ 4 ]これらの命令の中には、プロセッサメーカー間で共有されているものもあり、公式仕様には記載されていないものの、Intel とAMD の両方が命令とその目的を認識していることを示している。その他の命令は、メーカーまたは特定の製品ラインに固有のものである。x86 の未文書化命令の大部分の目的は不明である。
今日では、これらの指示の詳細は主に、古いシステムを正確にエミュレートする目的で重要視されている。