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