-
Notifications
You must be signed in to change notification settings - Fork 5
Babystep1
下に示すコードは、フロッピーから起動する起動コードで、ありえる最小の例です。
; 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
- 一番確かな筋による命令セットの解説
- http://www.intel.com/design/pentiumII/documentation.htm
- 読みやすいやつ
- http://www.baldwin.cx/386htm/toc.htm
- NASMのサイト
- http://www.nasm.us/
- Partcopy
- https://www.virtualobjectives.com.au/utilitiesprogs/partcopy.htm
- Randall Hydeによる、PCの奥底の解説
- http://www.plantation-productions.com/Webster/