c# - 为什么这两个简单语句的反汇编略有不同?

标签 c# assembly

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

第一个程序:

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/

相关文章:

c# - 自定义光标异常?

math - 如何将无符号数从有符号数转换为无符号数(二进制和十六进制)?

c# - 如何使用 Entity Framework 和存储库模式获取记录数

c# - Linq To SQL join 使用什么类型作为 List 的返回值

c# - 事件委托(delegate)(in)平等?

linux - 在汇编中从/dev/random 返回一个字节

c - DOS中字符表的内存地址是什么?

assembly - 比较指令无法正常工作

assembly - 是否可以使用外部宏参数被内部宏使用?

c# - 从容器中查找动态添加的控件