2014年9月14日日曜日

[OS作成]30日でできる!OS自作入門 1日目 (3)

書籍と同様に、ディレクティブを使って、もう少し分かりやすく書き直した。
/*
 helloos2.s
*/
 .byte 0xEB, 0x4E, 0x90
 .ascii "HELLOIPL" # ブートセクタの名前
 .word 512  # 1セクタのバイト数
 .byte 1  # クラスタの数
 .word 1  # FAT開始セクタ
 .byte 2  # FATの個数
 .word 224  # ルートディレクトリ領域のエントリ数
 .word 2880  # ドライブのセクタ数
 .byte   0xF0  # メディアタイプ
 .word 9  # FAT領域のセクタ数
 .word 18  # 1トラックのセクタ数
 .word 2  # ヘッド数
 .int 0  # ?
 .int 2880  # ドライブのセクタ数
 .byte 0, 0, 0x29 # ?
 .int 0xFFFFFFFF # ボリュームシリアル番号
 .ascii "HELLO-OS   " # ディスクの名前
 .ascii "FAT12   " # フォーマットの名前
 .space 18

// プログラム

 .byte 0xB8, 0x00, 0x00, 0x8E, 0xD0, 0xBC, 0x00, 0x7C
 .byte 0x8E, 0xD8, 0x8E, 0xC0, 0xBE, 0x74, 0x7C, 0x8A
 .byte 0x04, 0x83, 0xC6, 0x01, 0x3C, 0x00, 0x74, 0x09
 .byte 0xB4, 0x0E, 0xBB, 0x0F, 0x00, 0xCD, 0x10, 0xEB
 .byte 0xEE, 0xF4, 0xEB, 0xFD

// メッセージ 

 .string "\n\nhello, world\n"

 .org 0x1FE
 .byte 0x55, 0xAA # 55AAでブートセクタ

// ブートセクタ以降
 
 .byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
 .space 4600
 .byte 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
 .space 1469432
動作確認。
$ as --32 -o helloos2 helloos2.s
$ dd if=helloos2 of=helloos2.img skip=52 ibs=1 count=1474560
$ qemu-system-i386 -m 32 -localtime -vga std -fda helloos2.img

GASを使っていて、分かったこと

・コメントは3種類の書き方がある。
// コメント
/* コメント */
# コメント
・.stringディレクティブを使うと文字列の最後に0x00を付ける。
・.string,.asciiの文字列にはエスケープシーケンスが使える。

その他、分かったこと

・最初のセクタの最後の2バイトが0x55,0xAAの場合に、ブートセクタと判断し、プログラムを実行する。

ふーん。そういうふうに起動ディスクか判断していたのね。
ハードディスクの場合も同様かな?

やっと一日目が完了。先は長いな...