Skip to content
hikalium edited this page Jun 19, 2016 · 1 revision

はじめてのブートセクタ

下に示すコードは、フロッピーから起動する起動コードで、ありえる最小の例です。

; 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コマンドで書き込んでください。そうすれば、あとはフロッピーから起動するだけです。

  • Windowsでの例
nasmw boot.asm -f bin -o boot.bin
partcopy boot.bin 0 200 -f0 
OR
debug boot.bin
-W 100 0 0 1
-Q
  • Unixでの例
nasm boot.asm -f bin -o boot.bin
dd if=boot.bin of=/dev/fd0

参考文献

Clone this wiki locally