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」が表示されます。エラーメッセージが割と出ないようなコマンドラインオプションを選んでみました。