为什么这两个简单陈述的反汇编略有不同?

时间:2012-07-20 22:35:28

标签: c# assembly

我编写了两个简单的程序,将相同的整数值存储到两个不同的变量中,我想知道为什么两个程序之间的反汇编略有不同。

第一个程序:

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 

看起来差异只在内存地址中(即不是真正的区别)。无论如何,我认为这是正确的解释。

1 个答案:

答案 0 :(得分:5)

您的第一个示例将重写为:

y = 2;
x = y;

,因为

(y = 2)

“评估”到

y
分配y

这与反汇编1:1匹配。

旁注:您可以看到与属性相同的效果:

Button b;
b.Width = b.Height = 100; //inefficient!