我写了两个简单的程序,将相同的整数值存储到两个不同的变量中,我想知道为什么两个程序之间的反汇编略有不同。
第一个程序:
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
看起来差异仅在于内存地址(即实际上没有差异)。无论如何,我认为这是正确的解释。
最佳答案
您的第一个示例被重写为:
y = 2;
x = y;
因为
(y = 2)
“评估”到
y
在分配 y
之后。
这与反汇编 1:1 匹配。
旁注:您可以看到与属性相同的效果:
Button b;
b.Width = b.Height = 100; //inefficient!
关于c# - 为什么这两个简单语句的反汇编略有不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587800/