Gentoo
Funtoo
nasm
OS自作入門
More than 1 year has passed since last update.

FuntooでのOS自作入門1日目です。

QEMU

何がはまったって、QEMUが動作しないことでした。動作しないのではなく、出力モードが指定できてなかっただけでした。

/etc/portage/package.use (かそれに類するファイル)に

app-emulation/qemu sdl sdl2 gtk

と書いてemergeしなくてはなりませんでした。たぶんsdl,sdl2,gtkのどれか1つを書けばいいような気もします。

NASM

GASを使われている方が多いのですが、なぜかNASMが入っていたので、NASMでアセンブルしました。

NASKとの差は僅かで、識者の方が書かれているように、

; RESB 18 ; とりあえず18バイトあけておく
TIMES 18 DB 0

のように、「RESB 数」を「TIMES 数 DB 0」にすればうまく行きました。DBディレクティブは初期値を指定したメモリ確保、RESBディレクティブは初期値を指定しないメモリ確保のようなので、RESBのままでもいいような気がします。がNASMがワーニングを出すのが気になり、「TIMES 数 DB 0」を使いました。

DBやRESBのことをディレクティブと呼ぶんだと勝手に思い込んでいましたが、必ずしもそうではないようですね。CPUの命令ではないものはディレクティブかと思ってました。

; RESB 0x1fe-$ ; 0x001feまでを0x00で埋める命令
TIMES 0x1fe-($-$$) DB 0

識者の方が書かれているように、NASMの$はその行の先頭位置、$$は現在のセクションの
先頭位置を表すそうです。「現在のセクション」とはなんだろうと言うことになりますが、これだと現在の命令やデータなどが並んでいるまさにこの場所、ということでよいのでしょうか。$-$$を計算すれば、セクションの先頭からその行の先頭位置までのバイト数になりそうですね。0x1feがそのまま書かれていますが、これはセクションの先頭からの相対位置っぽく理解すればいいのでしょうか。

アセンブル

nasm helloos2.nas

helloos2というファイルができます。

実行

上でアセンブルしたhelloos2を実行します。

qemu-system-i386 -drive file=helloos2,format=raw,if=floppy -boot a

これでウインドウが開いて「hello, world」が表示されます。エラーメッセージが割と出ないようなコマンドラインオプションを選んでみました。