はじめに
下記の続きです.今回は1日目の作業を終わらせたいと思います.
作業
2. 結局何をやったのだろうか
メモ
PCを構成する装置
- 中央処理装置
- 主記憶装置
- 補助記憶装置
- 入力装置
- 出力装置
3. アセンブラ初体験
(30日でできる! OS自作入門 ~1日目~ その1 - m412uのメモ)ではバイナリエディタを使ってhelloos.imgを作成しました.
しかし,今回からはアセンブラを用いて同じファイルを作るみたいです.
ただし,3. アセンブリ初体験は長すぎるのでアセンブラ記述は飛ばします.
4. もうちょっと書き直してみる
アセンブリコード
;; hello-os
;; TAB=4
;; FAT12フォーマットフロッピーディスク用の記述
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL" ; ブートセクタの名前
DW 512 ; 1セクタの大きさ
DB 1 ; クラスタの大きさ
DW 1 ; FATの開始位置
DB 2 ; FATの個数
DW 224 ; ルートディレクトリ領域の大きさ
DW 2880 ; ドライブの大きさ
DB 0xf0 ; メディアのタイプ
DW 9 ; FAT領域の長さ
DW 18 ; 1トラック中のセクタ数
DW 2 ; ヘッドの数
DD 0 ; パーティションを使用していなければ0
DD 2880 ; ドライブの大きさ
DB 0, 0, 0x29 ; 固定値?
DD 0xffffffff ; ボリュームシリアル番号?
DB "HELLO-OS " ; ディスク名
DB "FAT12 " ; フォーマット名
RESB 18 ; 18バイト空ける
;; プログラム本体
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd9, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
;; メッセージ部分
DB 0x0a, 0x0a
DB "Hello, world"
DB 0x0a
DB 0
RESB 0x1fe-($-$$)
DB 0x55, 0xaa
;; ブートセクタ以外
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
サンプルコードと異なる部分が1つあるみたいです.
それは,41行目のRESB 0x1fe-$がRESB 0x1fe-($-$$)となっている点です.
アセンブラはnasmを使います.
nasmのインストール
$ sudo apt install nasm
$ nasm hello-os.s -o hello-os.img hello-os.s:24: warning: uninitialized space declared in .text section: zeroing hello-os.s:41: warning: uninitialized space declared in .text section: zeroing hello-os.s:48: warning: uninitialized space declared in .text section: zeroing hello-os.s:50: warning: uninitialized space declared in .text section: zeroing
実行
$ qemu-system-i386 -fda hello-os.img

その1と同じ画面が出力されました.
もう少し詳しく
- nasmとnaskの違い
http://hrb.osask.jp/wiki/?tools/nask
- FATファイルシステムに関する記事
まとめ
前回挑戦した際は5日目ぐらいまでいけたのでそこまではスムーズに進めそう.