OSを作ろう Chapter2(2)
Chapter2では、Chapter1で動かしたアセンブラの説明が載っていた。
Chapter2を読んで理解したことをココにメモする。
ブートセクタとブートセクタの内容が読み込まれるメモリアドレス
PCは、BIOSの設定によって決められたディスクの先頭から512byteを読み出して、決められたRAM領域に配置する。
この、ディスクの先頭から512byteをブートセクタとよび、ブートセクタに書かれてある内容が一番最初に実行される。
また、機械によって、ブートセクタを配置する場所が違うらしく、
例えば、AT互換機*1のBIOSでは、ブートセクタが読み込まれるメモリアドレスが、0x00007c00 - 0x00007dff と決まっている。
参考:http://community.osdev.info/index.php?%28AT%29memorymap
プログラムの開始位置指定命令(ORG命令)
どうやら、この命令はPCに対する命令ではなく、アセンブラに対する命令らしい。
PCはプログラムが読み込まれた位置に対して相対アドレスで動くことは出来ない。そのため、機械語になる時点で絶対アドレスを使っている必要がある。
アセンブラを機械語に”翻訳する人(nask)”は、プログラムがどこに読み込まれて実行されるかなんて知ったこっちゃ無い。だから、アセンブラを機械語に直すときに、絶対アドレス指定するために、「プログラムがどこに読み込まれるのか?」という事を”翻訳する人(nask)”に教えてあげる必要がある。
この、”翻訳する人(nask)”に「プログラムがどこに読み込まれるのか?」を教えてあげる命令がORG命令である。
BIOSを利用するための関数 INT 0x10
BIOSを利用して、PCを操作するときに使うのが「BIOSファンクション」というものだ。
今回利用したのは”INT 0x10”で、どうやら表示にかかわる指示をBIOSに与えるためのBIOSファンクションらしい。
今回、利用したのは文字を表示させるBIOSファンクションで次のものだ。
・一文字表示
http://community.osdev.info/index.php?%28AT%29BIOS
AH = 0x0e;
AL = キャラクターコード;
BH = 0;
BL = カラーコード;
戻り値:なし
註:ビープ、バックスペース、CR、LFは制御コードとして認識される
AH、AL、BH、BLはレジスタの名前。これらのレジスタに対応する値を入れて、”Int 0x10”をコールすると文字が表示される。
また、INT命令は機械語にすると、
CD | 定数(1バイト) |
となるみたいだ。おそらく、CPUが、"CD"という命令を読み込むと、決められた信号をBIOSに出しているのだろう。
そして、この信号を元にBIOSが画面表示を行っている様だ。
*1:簡単に言うとメーカーに依存しないパソコン。現在はメーカーが売り出しているPCもほとんどAT互換機だと思う