Visual C++でアセンブリ表示

マシン語を知らない子ども達
http://d.hatena.ne.jp/shi3z/20070911

エェェェーッ!こういうエントリが批判されるのには正直驚いた。
いやぁ、なんか世の中凄いことになってるなぁ

個人的には、何か問題にぶちあったときに解決のために助けてくれる道具という認識かなぁ。マシン語とか、論理学とかー。アルゴリズム何かもそうだし。
というか好奇心が許さないと思うのよね。何でも何故動いてるのか知りたくなるし。

で、C/C++言語で書かれたプログラムはどんな風にCPU上で動いてるのかを知るために、コンパイルされて出力されるマシン語を、一対一変換したアセンブリを見るのが手っ取り早いと思う。ということから、そのための方法を書いてみたり。

以下のように、Assemby Outputの項目をAssembly-Only Listing (/FA)に設定。

すると、コンパイル時に.asmファイルが生成されるので後はテキストエディタなどで開くだけ。
(あ、勉強する上では最適化コンパイルのオプションは切らないと、わけわかんなくなるので注意。でも、最適化コンパイラが何してるか知るにはいいかも。)

例えば、下のようC言語のソースがあったとして

int main(int argc, char* argv[])
{
	int i = 0, j = 1, k = 2;

	i = j + k;

	return 0;
}

1 + 2の計算は、

; int i = 0, j = 1, k = 2;
	mov	DWORD PTR _i$[ebp], 0
	mov	DWORD PTR _j$[ebp], 1
	mov	DWORD PTR _k$[ebp], 2
; i = j + k;
	mov	eax, DWORD PTR _j$[ebp]
	add	eax, DWORD PTR _k$[ebp]
	mov	DWORD PTR _i$[ebp], eax

という感じに。
そういえば、初めて関数の引数が渡される様子を見たときはドキドキしちゃったなぁ。