2007年10月28日日曜日

2日目:アセンブラの学習とMakefile入門(その1)

1日目では16進数で入力していましたが、アセンブラのニーモニックでの入力に変わりました。

まずは「ORG 0x7c00」でプログラムが読み込まれる位置を指定しています。
独習アセンブラでは「ORG 0x100」とやることが多かったですが、それとの違いはまだ分かりません。
※違いが判明:0x7c00はブートセクタが読み込まれるアドレスだそうです。詳細はhttp://community.osdev.info/index.php?(AT)memorymapを参照。

また、それに伴って、"$"の意味も「ファイルの何バイト目」ではなくて「読み込まれる予定のメモリの番地」になるそうです。

レジスタの話も登場です。独習でも読んでいるのですが、またちょっと違った角度からの話もでていました。

各種の演算にはAXレジスタを使うとプログラムが簡潔になるらしいです。

  • ADD CX, 0x1234 ⇒ 81 C1 34 12 機械語では4バイトの命令
  • ADD AX, 0x1234 ⇒ 05 34 12 こっちは3バイトの命令
と機械語に変換されるので、アセンブラのソースコードでは違いはみえませんが、機械語に翻訳された時点で4バイトと3バイトとなるようです。

著者を疑うわけではないですが、本当にそうなるのか確認してみましょう。
ADD命令のみを書いたアセンブラのソースコードをnasmでコンパイルしてみました。
> nasm add_cx.asm
> nasm add_ax.asm
でコンパイルしたファイルをBzで開いてみると、、、






おお、確かに機械語のバイト数が違いますね。