ぐだぐだ低レベルプログラミング(211)x86(16bit)、HLT命令

Joseph Halfmoon

今回もエミュレータ上では動作確認がとってもしずらい命令です。HLTとな。マニュアルをみれば「CPUをHalt stateに入れる命令」ということですが、そもそもHalt stateって何?って話です。まあ、アプリコードを書くのに専念しているよゐこには縁がない命令かも。まあ、知らなくても実害はない?どうなんだ?

※「ぐだぐだ低レベル プログラミング」投稿順indexはこちら

※実機動作確認(といってもエミュレータなんだけれども)には以下を使用させていただいております。

    •  Windows 11 PC (i5-1235U)
    •  Ubuntu 24.04 LTS on WSL2
    •  QEMU 8.2.2
    •  FreeDOS 1.3

今回は、動作確認すべきコードも無いんですけど。。。

割り込み待ち

RTOSのカーネル部分、あるいは「ベアメタル」の自前ソフトウエアを書いているとき、忙しく働いていたハズのソフトウエアに時折生じるエアポケットというか、アイドリング状態というかが生じることがあるでしょう。「忙中閑あり」とてお茶でもすすっていたいところです。まあよくやるのが、

ソフトウエアの無限ループ

でグルグルと回り続けるというもの。自分で自分にジャンプしたりしてね。

でもそうすると二度とループから抜け出せないのでは、というのは杞憂。RTOSなら勿論、自前のベアメタルでも各種のハードウエア割り込みが定義されている筈。割り込みがかかればループから制御は取り上げられて、割り込みハンドラへと制御が移ります。それをきっかけにまた別の何かを走らせるのはまた別な話。

HLT命令

遥か古代に8086/8088が誕生したときに、HLT命令を備えることは必然であったと想像されます。前にも述べましたが、8086/8088は「アセンブラレベルで8080のソースから変換」できる命令セットを持つという目標で設計されております。8080に存在するHLT命令を抜くという選択肢は無かったでしょう。

まあ互換性は「アセンブラレベル」なのでオペコード自体は8080とは異なりますがオペコードは1バイトです。

0xF4

ニーモニックは HLT と3文字。Halt の略だと。この命令を実行するとCPUはHalt stateに入ります。そしてHalt state というのは以下の条件が到来しなければ永遠に(電源切れるまで)続くと。

    1. RESET信号がアサートされる
    2. NMI(ノン・マスカブル・インタラプト)信号がアサートされる
    3. INTR信号が印加され、かつ、割り込みイネーブルである

全て外来の信号を待つことになります。上記の3条件のうち、1は所定の初期化番地へと飛んで行ってしまうので、IRETで戻ってくることはありません。2、3は割り込みハンドラが呼び出されるのでIRETすることは可能です。ここに「単なるソフトウエアの無限ループ」との違いがこれあり。「無限ループ」に割り込んだ場合、何もせずにIRETしたらまた無限ループに戻ってしまいますが、HLTの場合は「命令」であるので割り込みを受け付けたHLTの次の命令に戻ることになります。このあたりに何かディスパッチャみたいなものへの入口を置いておいたら良いですかね?知らんけど。

HLTではただ割り込み待つだけなので、CPU自体は忙しく動いている必要はありません。静かにしていてもらいたいもんだな。いろいろ妄想すると、割り込み待ちに必要な「ドメイン」以外のクロック供給を止めたれ、とか、もっとモダンにリーク電流を低減するために電源からバッサリいけ、とか考え付きますが、思い出してください

8086、8088は nMOS製品

でした。リーク電流どころか、レシオのある論理回路でDCパスにガンガン電流が流れつづける回路形式です。CMOSみたいにクロック止めたら電流消費も止まるなんて代物ではありません。よって、8086のためのHLT命令にそういう機能は一切ない筈。知らんけど。

まあその後、x86も時代をへてマルチコアの時代に入ったので、HLT命令の効用は実行したコアだけに限定したとか、時代の変遷は受けておるみたい。それはx86(16bit)ではない、別な話。

ぐだぐだ低レベルプログラミング(210)x86(16bit)、LOCKプリフィクス へ戻る