ここまでのまとめ

某緑の本を参考にx86向けの生ハードプログラムを作成した。
バイナリはフロッピーディスクのイメージで作成し、qemu上で動作した。
ここまでで、MBRのブートローダでフロッピーからバイナリデータを読み出し、
C言語で書いたコードの実行までできた。
アセンブラとして、nasm 2.10.09、C言語のコンパイラとしてgcc 4.8.2を使っている。
リンカは使わず、それぞれのバイナリをcatで連結しただけ。

[bootloader.S]
フロッピーのMBRに位置し、フロッピーの2セクタ目以降からデータを読み出し実行

[fgkenvm-startup.S]
ブートメッセージの出力
fgkenvm.cのバイナリへジャンプ

[fgkenvm.c]
BBBと出力後、HLTする

フロッピーディスクイメージの中身
------------------------------
0 byte  ---
  bootloader.Sのバイナリ
512 byte ---
  fgkenvm-startup.Sのバイナリ
  fgkenvm.cのバイナリ
-----------------------------

- 苦労ポイント１：C言語ファイルをバイナリ化する
gcc -Sで単純にコンパイルするとLinux上で動作するアセンブラが出来上がる。
オプションで標準ライブラリを使わないアセンブラを出力するようにした。

- 苦労ポイント2：アセンブラの形式
gcc -Sで得たアセンブラはGAS形式のアセンブラなのでintel syntax変更。
ここで、gasのintel syntaxとnasmの形式が微妙に異なるので、
nasmで処理できるように、gas2nasm.sedをネットから拾ってきて対応。
sed条件で足りない部分があったので追加。

- 苦労ポイント3:リンカ
本当はリンカスクリプト書いて、ELFのオブジェクトファイルをリンクすべきと
思ったが、面倒なのと、catでできちゃったのでとりあえずこのまま。
いずれ近いうちに対応しないといけなくなりそう。