利用者‐会話:東 遥/原稿/未定義命令
未定義命令とは、主にコンピュータの機械語において、オペコードとして表現しうるビットパターンのうち、命令(ニモニック)が対応づけられていないパターンを指して言う。また、BASIC言語で、予約語として登録されているが、その機能が定義されていないものを言う。
概要
[編集]コンピュータの機械語では、ビットパターンで表現される数に対して、実際の命令の数が少ない場合がある。例えば命令(オペコード)を1バイト(8ビット)で表現する場合には、256通りの表現があるが、i8085では、246個の命令しかなく、残りの10個については、動作が定義されない。この様に対応する命令が無いオペコードを、未定義命令、と言う。i8085以外にも、CPUによっては、この様な、命令の定義されていないオペコードが存在する。そのオペコードを命令として読み込んだ時の動作については、CPUにより扱いが異なる。
未定義命令(オペコード)
[編集]未公開命令
[編集]ニモニックが定義されていないオペコードの中には、特定の動作をするものがある。これは、CPUベンダが特定の動作をする様に設計したが、マニュアルには記載していない場合、または、制御ロジックの設計上派生した動作をするようになった場合がある。前者の場合を特に隠し命令、または未公開命令と言う事がある。
派生した命令
[編集]論理回路の設計上、派生するものがある。 例えば、Z-80のIX,IYレジスタの操作については、HLレジスタを操作する命令の前に &HDD (IXレジスタ指定)を付加する事で、HLレジスタに対する処理を、対象をIXレジスタ対して行う。本来は、IXレジスタは16ビットレジスタであるが、8ビット幅のLレジスタに対する処理を行う命令に&HDDプレフィックスを付ける事で、IXレジスタの下位8ビットに対する処理に切り替える事が出来る。 ([href="http://v-t.jp/premier/index.php?UID=1117596150 Dr.嶋ブログの記事]より)
また、Z-80ではSLL命令の様に、LSBに1を与える左シフト命令が存在する。通常のプログラミングでは1をシフトインする要求は無く、論理の派生で産まれたものと思われる。
未公開命令
[編集]所定の機能を果たすように設計したものの、諸般の都合でマニュアルに載せない命令もある。前述のi8085の、マニュアルに記載されていない10個のオペコードは、各々有意な動作をする事が確認されている。また、80286,80386では、CPU内部のレジスタを一気に書き換えるLDALL命令が存在する。これらは論理設計上派生した物とは到底考えられず、ベンダが意図を持って設計したものであるが、敢えてマニュアルに掲載しないものである。
これらの命令を組み込んだ理由については色々と言われるが、一般には理由が公開されることはなく、あくまでも推測に留まる。
詳細については未公開命令を参照の事。
未定義命令(オペランド)
[編集]オペコードに限らず、オペランドの指定方法でも、マニュアルに記載されていないビットパターンで想定外の動作をおこす事がある。
例えば、MC6809のTFR命令(レジスタ間転送)では、転送元のレジスタを番号で指定するが、16ある番号の内で対応するレジスタがないものがある。対応するレジスタがない番号を指定すると、オール1ビットのデータがロードされる。これを利用して、2の補数で-1が必要な場合に、イミディエイト値を読むのに較べて命令の長さが短くて済む。
未定義命令トラップ
[編集]未定義命令を読み込むと、所定のサブルーチンに移行する様に設計されたCPUもある。この様なものを未定義トラップという。
異常動作の検出
[編集]一般に、プログラムが正しく構成され、且つ、ハードウェアが正常に動作している限りは、CPUは常にプログラムで意図した命令を読み込み続ける。しかし、バグが混入してプログラムの実行が正しく行われなかったり、暴走したり、ハードウェアに障害が発生して正しい命令を取り込めない場合には、プログラマが意図した命令を読み込み続けることが出来なくなり、命令が定義されていないオペコードを読み取る事がある。この場合には、ハードウェアの異常、またはソフトウェアの異常という事で、CPUは所定のサブルーチンに強制的に遷移したり、動作を停止(HALT)する。
この様に、未定義命令を検出することを未定義命令トラップという。
サブルーチンコール
[編集]CPUのアーキテクチャ次第、或いはシステムの構成次第では、この未定義命令トラップを有効活用する事が出来る。未定義トラップを発生させるオペコードは、他のオペコードと同じサイズであることが多い。また、未定義トラップで発生するサブルーチンコールでは、直前までのコンテキストを保存していることもある。この場合には、そのサブルーチンで所定の動作を行って、未定義命令の直後に制御を戻してプログラムを続行することも可能である。この場合には、未定義命令を、オペコードサイズの小さいサブルーチンコール命令、と見立てる事が出来る。
システムコール
[編集]上記の発想をより積極的に用いて、 MC68000シリーズ Alpha AXP21064等