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

Ric*_*ano 1 c# assembly

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

第一个项目:

int y;
int x = (y = 2);
Run Code Online (Sandbox Code Playgroud)

拆卸:

0000003a  mov         dword ptr [ebp-40h],2 
00000041  mov         eax,dword ptr [ebp-40h] 
00000044  mov         dword ptr [ebp-44h],eax
Run Code Online (Sandbox Code Playgroud)

第二个方案:

int x = 2, y = 2;
Run Code Online (Sandbox Code Playgroud)

拆卸:

0000003a  mov         dword ptr [ebp-40h],2 
00000041  mov         dword ptr [ebp-44h],2 
Run Code Online (Sandbox Code Playgroud)

第一个程序中的第二行,显然是唯一的变化,只是将指向的值复制[ebp-40h]eax注册表中,对吧?也许这是一个愚蠢的问题,但为什么这些略有不同?至少可以说,我对汇编不是很熟悉,所以我认为你必须在指向它之前将值移入注册表中吗?(或者不管第三行是什么.我认为它指向......)

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

编辑

根据评论中的讨论,我编译了这两个片段的Release版本,而不是之前使用过的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 
Run Code Online (Sandbox Code Playgroud)

第二个方案:

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 
Run Code Online (Sandbox Code Playgroud)

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

usr*_*usr 5

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

y = 2;
x = y;
Run Code Online (Sandbox Code Playgroud)

因为

(y = 2)
Run Code Online (Sandbox Code Playgroud)

"评估"到

y
Run Code Online (Sandbox Code Playgroud)

分配后y.

这与反汇编1:1相匹配.

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

Button b;
b.Width = b.Height = 100; //inefficient!
Run Code Online (Sandbox Code Playgroud)