1

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

第一个程序:

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注册表中,对吗?也许这是一个愚蠢的问题,但为什么这些略有不同?至少可以说,我对汇编不是很熟悉,所以我认为您必须在指向它之前将值移动到注册表中?(或第三行做什么。我认为它指向......)

为了可读性,我打算永远不要像在第一个程序中那样在严肃的代码中实例化变量。

编辑

根据评论中的讨论,我编译了这两个片段的发布版本,而不是我之前使用的调试版本。结果几乎相同:

第一个程序:

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 

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

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 回答