萌えハッカーニュースリーダー

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

出典: https://www.righto.com/2023/07/undocumented-8086-instructions.html
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

爆発は困るのじゃ! まあ、ロボ子が爆発しても困るけどな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search