8086リアルモードを制覇せよ!

Last updated 2002-11-04

背景と目的

Brainstorming in Ehime を開催する前は、SYMDEB.EXE の I/O 命令を用いた簡単なハード操作ぐらいに留めておくつもりだったのですが、蓋を開けてみてビックリ仰天。参加者の皆さん全員が「是非とも機械語でハードウェアをいじりたい!」と希望されたからです(詳細はこちらをご参照ください)。結局、この「高い志」に刺激され、いきなりハンドアセンブルで開講ということになりました。

私は本会を通じて、「誰もがパソコンの中身を完全に理解・把握し、オリジナルのOSやロボットを作ってみたいと考えている」という事実を再認識させられました。もちろん、遠路はるばるこの会に参加してくださった皆さんが、ずば抜けた資質を持った方々であったことは間違いありません。しかし、そのようなバックグラウンドを差し引いても、この事実は重要な意味合いを持っていると感じました。

そこで、かねてから暖めていた「ハードウェアに立脚した」プログラミングを解説するつもりです。本来はもう少し先の予定だったのですが、Brainstorming in Ehime に参加できなかった方々から講義内容の一般公開を求めるメールが届くようになり、「もはや猶予はない」と判断したのです。

GCC プログラミング工房や Interface 7月号では、Linux 上のプログラミング環境をテーマに据えて執筆してきました。これは上方からのアプローチ、すなわちトップダウンの学習方法と言えます(正確には頂上からではなく、5合目付近でしょうか)。しかし、誌面と進行上の都合により、肝心の基礎部分についてはほとんど触れられていません。ピラミッドにしろ、五重塔にしろ、大切なのは基礎部分です。見目麗しく飾られた豪奢な大理石や塗り物は、いつかは削げ落ち消え去るものです。風雪を堪え忍び、数千年・数百年の時を飛び越えることができるのは、頑強な基盤あってのことと言えるでしょう。

プログラミングにおいても、ハードウェアとCPUが接する最下層部分は、非常に重要であるにもかかわらず、これまであまり触れられていなかったように思います。だからこそ、Brainstorming に参加された方々は、目を輝かせながらSYMDEB 上のワンラインアセンブルに熱中されたのでしょう。

それでは、ボトムアップが本来正しいアプローチ方法なのでしょうか?残念ながら、この点について私はまだ答えに辿り着いていません。ただいくつか言えることは、トップダウンとボトムアップ、このふたつのアプローチを組み合わせ全貌を把握する方法も悪くはないだろうということ。そしてもうひとつ、ボトムアップアプローチでCPUを学習する際には、CPUの中にも 486, 8086, PIC/AVR といったヒエラルキーが存在するということです。

PC-UNIX の理解を急ぐ人の中には、8086 リアルモードを通り過ごして、いきなり 386 プロテクトモードに挑戦される方もいらっしゃることでしょう。しかし、私はこれは誤ったアプローチではないかと思います。恐らく、何年間書籍を読み続けたところでゴールに達することはできないでしょう。

かの Linus 氏も最初は、リアルモードでブートプログラムを組み、リアルタイム割り込みを実装し、フロッピーディスク入出力の追加、プロテクトモードへの移行、など小さいプログラムを積み重ねることで Linux に近づいていったはずです。私達もまた、基本に立ち戻る必要があるのではないでしょうか?

以上を踏まえ、FreeDOS を用いた基本学習環境を構築し、8086 リアルモードと PC-AT ハードウェア操作をオリジナル DOS の作成を通じて、徹底理解するテーマを考えました。本サイトで提供する情報も、しばらくはこれらに関連したものに重点を置きたいと考えます。取り急ぎ、必要になる参考書籍を「お勧めの書」で紹介しましたので、ご覧ください。

今後の予定

当初は Brainstorm ML 上で具体的な講義を進める予定だったのですが、思うように時間が取れません。ただ、幸いなことに UNIX USER 編集部の粋な計らいで、GCC プログラミング工房上で 8086 リアルモード解説のお許しが「出そうな」感触です(ひとえに私の力量にかかっているのですが・・)。

ML上の資料で商業雑誌並の質を実現することは正直難しいものがあります。なぜか?単純にお金の問題と考えられる方もいらっしゃるでしょうが、実はそうではありません。

原稿は個人一人で書くよりも、編集の作業を通過することでより分かりやいものに進化しますし、必要な図やイラストもプロの手を経ることで、俄然説得力が増すのです。よって、WebやML上で情報を提供するよりも、連載記事で原稿を書く方が遙かに「時間」に対するコストパーフォーマンスが高いのです。

近々、GCC プログラミング工房上では octopus に「スタック」を実装する話が登場します。スタックはプログラミングの基本中の基本であり、これを理解せずしてアセンブラーを体得することは不可能でしょう。

ということで、今しばらくは GCC プログラミング工房をフォーローして頂ければ幸いです。


Your SysOp is Wataru Nishida , M.D., Ph.D.