CPUの隠し命令

CPUには隠し命令、すなわち実装されているもののドキュメントで触れられていない命令があります。実際にプログラミングして試してみましょう。

(本記事の初稿は2004年です。10年以上経過した現在でも有用な内容と思われるので、そのままの内容で公開します。)

なお、これらの命令を実際のアプリケーションに組み込むのは止めましょう。ドキュメント化されていない、すなわちCPUメーカーが存在を公認していない命令なので、将来のCPUで動作しなくなる恐れがあります。

■SETALC/SALC
SETALC(もしくはSALC)という命令があります。Set AL on Carry Flagの略で、CF(キャリー・フラグ)のビットをALレジスタの各ビットにコピーします。

この命令の存在は286の頃から知られていますが、インテルのドキュメントではいまだに隠し命令扱いです。AMD64ではオペコードマップにSALCのニーモニックで記述があるので隠し命令ではありませんが、命令そのものについての記述はありません。(オペコードマップの注釈には「Invalid on 64-bit mode」とある。)

テスト用に以下のようなプログラムを作ります。なお、32ビットと64ビットでソースコードを共用できるようにし、
命令実行時にCPUのEXCEPTIONが発生しても大丈夫なように構造化例外処理(SEH)内でSETALC/SALCを実行します。

まず、Pentium4-3.06GHz(Northwood, HT対応)+WindowsXP SP2で試してみました。

次に、Athlon64 3000+(NewCastle)+x64版WindowsXPで試してみます。

32ビットについては、実質使えるみたいです。64-bitについては、AMD64ではダメみたいです。EM64Tではどうなるのでしょうか?EM64TがEnableなPentium4/CeleronD/Xeonで果たしてどうなるか、興味津々です。(たぶんAMD64と同じになるのでしょうが。)

■その他の命令
その他の命令についても、ニーモニック、オペコード、概要、AMD64オペコードマップ記載の有無のみ記しておきます。


執筆日:2004年12月21日(火)(www.marbacka.net内の別のサイトで公開)
最終更新日:2017年2月19日(日)

スポンサーリンク