1日目の続き(その2)

今日は休日なので、頑張って進めます
昨日は、バイナリエディタで入力していた内容をgasに変換しただけなので
今日は、OS自作本でいうところのもうちょっと書き直してみるあたりからスタートです。

GASの新たな命令

命令 説明
.word 2バイトデータを直接書く
.int 4バイトデータを直接書く
.org .org new-lc , fill とう形で使用する。new-lcは、何バイト目までかとうこと、現在のバイト位置からnew-lcを埋める値

gccのオプション(-nostdlib)

通常のコンパイル時には、標準システムスタートアップファイルや標準システムライブラリを使用してコンパイルされる。
単なるバイナリとして出力したいので、標準システムスタートアップファイルや標準システムライブラリを使用しないオプションを利用している。

helloos.sの書き換え

昨日のhelloos.sの内容をアスキコード表などを見ながら入力してみると
OS自作本と同じようになりました。

# 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
.byte  0xeb, 0x4e, 0x90
.ascii "HELLOIPL"         # ブートセクタの名前(8バイト)
.word  512                # 1セクタの大きさ
.byte  0x01               # クラスタの大きさ
.word  1                  # FATの開始位置(普通は、1セクタ目から)
.byte  0x02               # FATの個数
.word  224                # ルートディレクトリ領域の大きさ(224エントリ)
.word  2880               # このドライブの大きさ
.byte  0xf0               # メディアのタイプ
.word  9                  # FAT領域の長さ
.word  18                 # 1トラックにあるセクタ数
.word  2                  # ヘッドの数
.int   0                  # パーティションの個数(未使用なので0)
.int   2880               # このドライブの大きさをもう一度書く
.byte  0x00, 0x00, 0x29   # ??
.int   0xffffffff         # ボリュームシリアル番号
.ascii "HELLO-OS   "      # ディスクの名前(11バイト)
.ascii "FAT12   "         # フォーマットの名前(8バイト)
.skip  18, 0x00           # ??

#プログラムの本体
.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

#表示メッセージ部分
.byte 0x0a, 0x0a
.ascii "hello, world"
.byte 0x0a

.org 0x1fe, 0x00         # 0x1fe(512バイト)目で0埋めする
.byte 0x55, 0xaa

#以下はブートセクタ以外の記述
.byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
.skip 4600, 0x00
.byte 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
.skip 1469432, 0x00

まだ、ほとんど意味がわからん。。
とりあえず、最後まで読んで行こう。