osdev-jpでは、OS開発に有用な情報を収集し公開しています
下に示すコードは、フロッピーから起動する起動コードで、ありえる最小の例です。
; boot.asm
hang:
jmp hang
times 512-($-$$) db 0
CPUはリアルモードで起動し、0000:7c00のアドレスにあるこのコードを、BIOSが読み込みます。
times 512-($-$$) db 0という記述は、NASMに対し512バイトまで0で埋めろという指示です。こうしないと、後でpartcopyを実行するときにうまくいきません。
ブートシグネチャ(0xAA55)というものが最後にあるのをよく目にするかもしれません。古いバージョンのBIOSは、このシグネチャを、ディスク上のブートセクタの特定に使うのですが、最近ではどうやら必要ないようです。もし必要だとしたら、上のコードは以下のように書き換えられます。
; boot.asm
hang:
jmp hang
times 510-($-$$) db 0 ; 2 bytes less now
db 0x55
db 0xAA
しかし、本当に気づいて欲しいところは、どうやって起動させたか、というところと、カーソルが真っ黒な画面でチカチカしているというところで、さらにあなたは2つのことに気づくでしょう。ひとつは、フロッピーのモーターが止まっているというところと、もうひとつはCtrl-Alt-Delを押せば再起動する、という点です。これはつまり、割り込み(たとえばINT 0x09)がまだ生きている、ということを示しています。
割り込みフラグについて理解するために、以下のコードを試してみてください。
;boot.asm
cli
hang:
jmp hang
times 510-($-$$) db 0
db 0x55
db 0xAA
今度は起動すると、フロッピーのモーターが止まらず、Ctrl-Alt-Delを押しても再起動しないことが分かるでしょう。
このコードからループ部分を無くして、単にゼロで埋めるだけにすると、起動時にBIOSが何か言ってくることでしょう。私のマシンでは、"Operating System Not Found"と言われました。ブートシグネチャだけ残してやるとどうなるかは試していませんが。
こんなプログラムは、とても友達に見せられるようなものではないかもしれません。しかしこれは、詳しい説明に入る前の、最小限の例なのです。もしこれがいらいらするというのなら、ここでやめておくことにしましょう。
ここで説明したコードは、NASMでアセンブルし、partcopyコマンドや、ddコマンドで書き込んでください。そうすれば、あとはフロッピーから起動するだけです。
nasmw boot.asm -f bin -o boot.bin
partcopy boot.bin 0 200 -f0
OR
debug boot.bin
-W 100 0 0 1
-Q
nasm boot.asm -f bin -o boot.bin
dd if=boot.bin of=/dev/fd0