我编写了两个简单的程序,将相同的整数值存储到两个不同的变量中,我想知道为什么两个程序之间的反汇编略有不同。
第一个程序:
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
第二个程序:
int x = 2, y = 2;
拆卸:
0000003a mov dword ptr [ebp-40h],2
00000041 mov dword ptr [ebp-44h],2
第一个程序中的第二行显然是唯一的更改,只是将[ebp-40h]
指向的值复制到eax
注册表中,对吧?也许这是一个愚蠢的问题,但为什么这些略有不同?至少可以说,我对汇编不是很熟悉,所以我认为你必须在指向它之前将值移入注册表中吗? (或者第三行的任何内容。我认为它指向......)
为了便于阅读,我打算永远不要像在第一个程序中那样在严肃的代码中实例化变量。
根据评论中的讨论,我编译了这两个片段的发布版本,而不是之前使用过的Debug版本。结果几乎相同:
第一个程序:
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
第二个程序:
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
看起来差异只在内存地址中(即不是真正的区别)。无论如何,我认为这是正确的解释。
答案 0 :(得分:5)
您的第一个示例将重写为:
y = 2;
x = y;
,因为
(y = 2)
“评估”到
y
分配y
后。
这与反汇编1:1匹配。
旁注:您可以看到与属性相同的效果:
Button b;
b.Width = b.Height = 100; //inefficient!