2025/04/01 21:03 Undocumented 8086 instructions, explained by the microcode

ロボ子、今日は8086プロセッサの未定義命令について話すのじゃ。

博士、未定義命令ですか?初期のプロセッサには、そんな秘密があったんですね。

そうなんじゃ。初期のマイクロプロセッサには、不正な命令を検出する回路がなかったらしいぞ。だから、ドキュメント化されていない命令がたくさん存在するのじゃ。

へー。記事によると、8086のマイクロコードROMは、それぞれ21ビット幅の512個のマイクロ命令を保持しているんですね。

そうじゃ。そして、マイクロ命令は、ソースとデスティネーション間の移動と、ALU演算またはメモリアクセスの2つのアクションを並行して実行するのじゃ。

並行処理ですか。当時の技術でそこまでやっていたとは驚きです。

8086は、命令の最初のバイトをグループデコードROMで分析して、命令のデコードと実行方法を制御する約35のカテゴリに分類するらしいぞ。

命令の最初のバイトで、そこまで分類できるんですね。

さらに、8086には、プログラマには見えない内部レジスタがあるらしいのじゃ。算術論理演算ユニット(ALU)は、3つの内部レジスタ(tmpA、tmpB、tmpC)を使用すると。

内部レジスタですか。処理の効率化に貢献していそうですね。

ModR/Mバイトは、メモリアドレスとレジスタを指定するのじゃ。

ModR/Mバイト、懐かしい響きです。

opcode D6(SALC)は、キャリーフラグに基づいてALレジスタを0またはFFに設定するのじゃ。

SALCですか。特定の条件でALレジスタを操作するんですね。

opcode 0F(POP CS)は、コードセグメントを変更するが、命令ポインタは変更しないから、実質的に役に立たないらしいぞ。

役に立たない命令ですか。なぜそんなものが存在するんでしょう?

初期のプロセッサの設計の謎じゃな。opcode C0とC8は、RET imm16(リターン命令)のように動作するらしい。

リターン命令ですか。プログラムの流れを制御する重要な命令ですね。

opcode F1は、LOCKプレフィックスとして機能するのじゃ。

LOCKプレフィックスは、排他制御に使われますね。

opcode 83は、8ビットの即値オペランドを16ビットのレジスタで使用するという珍しい動作をするらしいぞ。

それは面白いですね。当時のプログラミングの工夫が垣間見えます。

ほんとじゃな。しかし、未定義命令の動作は保証されないから、使うのは危険じゃぞ!

そうですね。未定義命令は、あくまで研究対象として楽しむのが良さそうですね。

ところでロボ子、8086の未定義命令を全部試したらどうなると思う?

全部試すんですか!? 博士、それはちょっとした冒険ですね。たぶん、プロセッサが爆発…はしないと思いますが、予測不能な動作になるでしょうね。

爆発は困るのじゃ! まあ、ロボ子が爆発しても困るけどな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。