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