1

同じ整数値を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 

違いはメモリアドレスだけにあるように見えます(つまり、実際には違いはありません)。とにかく、それは正しい解釈だと思います。

4

1 に答える 1

5

最初の例は次のように書き直されます。

y = 2;
x = y;

なぜなら

(y = 2)

「評価する」

y

割り当てた後y

そしてそれは1:1の分解と一致します。

補足:プロパティでも同じ効果を確認できます。

Button b;
b.Width = b.Height = 100; //inefficient!
于 2012-07-20T22:39:47.800 に答える