我写了两个简单的程序,将相同的整数值存储到两个不同的变量中,我想知道为什么两个程序之间的反汇编略有不同.
第一个项目:
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)
看起来差异只在内存地址中(即不是真正的区别).无论如何,我认为这是正确的解释.
您的第一个示例被重写为:
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)