ラベル 2日目 の投稿を表示しています。 すべての投稿を表示
ラベル 2日目 の投稿を表示しています。 すべての投稿を表示

2007年10月28日日曜日

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

文字列の表示処理が、WindowsのDOSプロンプト上で動くものとはちょっと違うようです。
DOSのシステムコールではなくて、BIOSのシステムコールを使うことになるからなので当然?
DOSでは、

  • MOV AH, 0x02 ;1文字出力

  • MOV DL, 0x31 ;"1"の文字コード

  • INT 0x21 ;DOSファンクションコール


でしたが、

  • MOV AH 0x0e ;1文字出力

  • MOV AL, 0x31 ;"1"の文字コード

  • MOV BH, 0 ;

  • MOV BL, 15 ;カラーコード

  • INT 0x10 ;ビデオ関係のファンクションコール


となっています。
BIOSのファンクションコールについては、http://community.osdev.info/?(AT)BIOSに詳細が書いてあります。

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で開いてみると、、、






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