同じ整数値を2つの異なる変数に格納する2つの単純なプログラムを作成しましたが、なぜ逆アセンブルが両方のプログラム間でわずかに異なるのか疑問に思います。
最初のプログラム:
int y;
int x = (y = 2);
分解:
0000003a mov dword ptr [ebp-40h],2
00000041 mov eax,dword ptr [ebp-40h]
00000044 mov dword ptr [ebp-44h],eax
2番目のプログラム:
int x = 2, y = 2;
分解:
0000003a mov dword ptr [ebp-40h],2
00000041 mov dword ptr [ebp-44h],2
最初のプログラムの2行目は、明らかに唯一の変更であり、ポイントされた値をレジストリにコピーするだけ[ebp-40h]
ですeax
よね?ばかげた質問かもしれませんが、なぜこれらがわずかに異なるのですか?控えめに言っても、私はアセンブリにあまり詳しくないので、値を指す前にレジストリに値を移動する必要があると思いますか?(または3行目は何でも。私はそれが指していると思います...)
読みやすくするために、最初のプログラムで行ったように、深刻なコードで変数をインスタンス化することは絶対にしない予定です。
編集
コメントの説明によると、以前使用していたデバッグビルドではなく、これら2つのスニペットのリリースビルドをコンパイルしました。結果は実質的に同じです。
最初のプログラム:
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 mov dword ptr [ebp-4],ecx
00000007 cmp dword ptr ds:[005E14B4h],0
0000000e je 00000015
00000010 call 6C37403F
00000015 nop
00000016 mov esp,ebp
00000018 pop ebp
00000019 ret
2番目のプログラム:
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 mov dword ptr [ebp-4],ecx
00000007 cmp dword ptr ds:[005514B4h],0
0000000e je 00000015
00000010 call 6C42403F
00000015 nop
00000016 mov esp,ebp
00000018 pop ebp
00000019 ret
違いはメモリアドレスだけにあるように見えます(つまり、実際には違いはありません)。とにかく、それは正しい解釈だと思います。