OS 起動の仕組みに書いたように、
PC の BIOS は
ディスクの先頭セクタ(マスタブートレコード)の 512 バイトを
0000h:7C00h 〜 0000h:7DFFh に読み込み、
0000h:7C00h から起動プログラムを実行してくれます。
しかし、たった 512 バイトで OS を作るのは困難でしょう。
そのため、普通はこの 512 バイトはディスクのほかの部分を
読み込む起動プログラムローダとして使います。
とはいえ、いきなり起動プログラムローダを書くのは大変ですので、
ここではまず 512 バイトでできる簡単なプログラムを書くことにします。
今回は、Hello,world をブートセクタに移植してみましょう。
以後、マスタブートレコード用のコードをマスタブートローダと呼ぶことにします。
マスタブートローダは
リアルモード BIOS が提供する機能をすべて利用できます。
PC 上での OS の起動に有用な機能の一部を表に示します。
| 割り込み | パラメータ | 機能 |
| INT 10h | AH=00h AL=モード(03h=80x25テキスト) | ビデオモードを設定します。 起動時のモードは通常、03hです。 |
| INT 10h | AH=0Eh AL=文字 BL=文字色(07h=白) | 文字を画面に出力します。 |
| INT 12h | (パラメータなし) | AXにリアルモードメモリサイズをKB単位で取得します。 |
| INT 13h | AH=00h DL=ドライブ(00h=FDD0,80h=HDD0) | ディスクをリセットします。 |
| INT 13h | AH=02h DL=ドライブ AL=読み込むセクタ数 CH,CL,DH=CHSパラメータ ES:BX=データ |
ディスクから読み込みます。 CHSで指定された位置からALセクタ分読み込みます。 |
| INT 13h | AH=03h DL=ドライブ AL=書き込むセクタ数 CH,CL,DH=CHSパラメータ ES:BX=バッファ |
ディスクへ書き込みます。 CHSで指定された位置へALセクタ分書き込みます。 |
| INT 16h | AH=00h | キーボード入力を読み込みます。 AL=文字 AH=キーボードのスキャンコード 入力がなければ、入力されるまで待ちます。 読み込んだ入力は破棄されます。 |
| INT 16h | AH=01h | キーボード入力があるか調べ、ZFを設定します。 ZF(ゼロフラグ)=1なら入力なし、ZF=0なら入力あり AL=文字(入力がある場合) AH=スキャンコード(入力がある場合) この BIOS コールは入力を調べるだけで破棄しません。 |
| INT 16h | AH=04h | 保存中のキーボード入力をすべて破棄します。 |
| INT 1Ah | AH=02h | 現在の日付と時刻を取得します。 BX=1980/01/01からの経過日数 CL:CL:DH:DL=時:分:秒:(1/100秒) |
Hello,worldの場合、
INT 10h、AH=0Ehを使えば実現できます。
これを nasm で書くと、次のようになります。
org 7C00h mov si, msg_hello put_next: mov ax, cs mov ds, ax lodsb cmp al, '$' jz put_end mov ah, 0Eh mov bl, 07h int 10h jmp put_next put_end: self: jmp self msg_hello: db 'Hello, world!',0dh,0ah,'$' times 01FEh-($-$$) db 0 db 55h,0AAh最後の 55h、0AAh は起動可能マークです。
// fill144.c 使い方: fill144 入力ファイル名 出力ファイル名
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char ** argv)
{
FILE * fi;
FILE * fo;
char * bufptr;
const int buflen = 2880 * 512;
if (argc != 3) return 1;
fi = fopen(argv[1],"rb");
fo = fopen(argv[2],"wb");
bufptr = (char *)calloc(buflen,1);
fread(bufptr,1,buflen,fi);
fwrite(bufptr,1,buflen,fo);
fclose(fo);
fclose(fi);
return 0;
}
これでフロッピーディスクイメージを作れるようになりました。
このイメージを実際に作り、
実機や
PC エミュレータ(bochsなど)
で起動してみると、
Hello,world が表示されることを確認できます。