アセンブル&リンクの基礎

アセンブル

アセンブラの場合は,アセンブリ言語で書いたプログラムが単独でいきなり意味のあるプログラムになっていることは少なく, 通常はC言語などで作成したプログラムから使用するサブルーチンになっているのが普通. したがって,通常はアセンブリ言語ソースプログラム(*.asm)から オブジェクトファイル(*.obj)をつくって他のモジュールとリンクして最終的に実行可能ファイル(*.exe)にすることが多い. このような場合,次のようにアセンブルする.

> ml /c skel.asm

リンク

生成されたオブジェクトファイル(上記の例ではskel.obj)は, 次のようにリンクして実行可能ファイルを生成する.

> link skel.obj libcmt.lib

この例では,skel.asmが C言語のメイン関数に相当するプログラムになるようにつくってある(手続き名をmainにしてある)ため, C言語のスタートアップルーチンが収録されている標準ライブラリをリンクすることで実行可能ファイルskel.exeを作成できる.

単にlink skel.objとしてしまうと次のようなエラーになる.

Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : error LNK2001: 外部シンボル "_mainCRTStartup" は未解決です。
skel.exe : fatal error LNK1120: 外部参照 1 が未解決です。

何をリンクすべきかは,Visual C++のバージョンによってかわるようで, 上ではlibcmt.libというライブラリを指定しているが, バージョンによってはlibc.libというライブラリがある場合もある. どのライブラリをリンクすればいいかは,Visual C++のライブラリ ディレクトリ (2005の場合C:\Program Files\Microsoft Visual Studio 8\VC\lib)を覗きながら推理すると 大体想像がつく. …とかいいつつ,想像がつかない場合も少なくないので,そういう場合にはdumpbinで収録されているシンボルを調べて適切なライブラリを決める.

バージョン C言語標準ライブラリ ライブラリ パス
Visual Studio 2005 libcmt.lib C:\Program Files\Microsoft Visual Studio 8\VC\lib
Visual Studio .NET libc.lib C:\Program Files\Microsoft Visual Studio .NET\Vc7\lib

※インストール先を変更した場合はパスを読み替えてください.

なお,アセンブルとリンクを一気にやってしまう場合には次のようにすればよい.

> ml skel.asm libcmt.lib

このようにml.exeにライブラリを同時に指定することで,必要なリンクまでやってくれる. ただし,アセンブリ言語でプログラムを作る場合,上記のように単独で実行可能ファイル(*.exe)ができるレベルの プログラムになっているのは珍しいので,あまり意味はないかも.

デバッグ版の作成

デバッグしたい場合は,ml.exeにオプション/Zi(Add symbolic debug info)をつけてアセンブルする. マイクロソフト製ツールはml.exeに限らず, C/C++コンパイラcl.exeなどでもデバッグ用のオブジェクトコードを生成するオプションは/Ziに統一されているため, 覚えておくとよい.

> ml /c /Zi skel.asm

さらにリンカlink.exeには/debugオプションをつける.

> link skel.obj libcmt.lib /debug

この時点で いつもは生成されないファイルskel.pdbskel.ilkができるはず.

あとは,devenv skel.exeとすればよい.

> devenv skel.exe

※Visual Studio .NETの場合,開発環境(devenv)が起動した直後に ソリューションファイル名(*.sln)をどうすかとか聞かれたりするけど,適当にYesと答えておけばよい. Visual Studio 2005ではこのステップは開発環境を終了するときになっているので,特に気にしなくてもよい.

実行は,まず最初の1回だけは とりあえずステップ実行([F10])するのがよいだろう. 実行が始まる前はまだシンボルがロードされていないので,ブレイクポイントを設定しても 指定したシンボル名が存在しているかどうかがわからず効率が悪い(タイプミスなどの間違いが発見できない). これに対して とりあえず1ステップだけ実行し,ブレイク状態になってからブレイクポイントを設定するとシンボルが見えるようになるので, ブレイクポイントの設定時にタイプミスなどで存在しないシンボル名を入れると指定したシンボル名の左側に“!”とか“?”マークのアイコンがでて, 何か間違えたことがわかるようになり効率がよい(正しくタイプすると単に赤丸になる;下図参照).

正しいシンボル(_main)を指定した場合 存在しないシンボル(main)を指定した場合
スクリーンショット スクリーンショット

※スクリーンショットは,Visual Studio 2005 Standard 日本語版のもの.

リリース版・デバッグ版 ファイルサイズ
ファイル名 リリース版サイズ デバッグ版サイズ
skel.obj 382 744
skel.pdb --- 699,392
skel.ilk --- 549,692

演習用リソース


はたいたかし
2006-08-04
トップ > 開発ツール > Windows > MASM