当将bool设置为TRUE时,.Net程序集添加了多余的AND?

时间:2012-11-23 03:59:04

标签: c# assembly clr

以下用VS2010中的C#编写的.Net 4.0代码:

bool b = false;

具有以下反汇编:

XOR EDX,EDX
MOV DWORD PTR[EBP-3Ch],EDX

这很有道理。

但是,以下代码:

bool b = true;

具有以下反汇编:

MOV EAX,1
AND EAX,0FFh
MOV DWORD PTR[EBP-3Ch],EAX

AND操作的目的是什么?为什么不只是MOV EAX,1

Line | EAX
-----------
   1 | 0x01
   2 | 0x01 & 0xFF = 0x01
   3 | 0xFF

3 个答案:

答案 0 :(得分:2)

我怀疑and 0xff被截断为8位布尔值。关于内部问题,我不太了解,但我怀疑bool b = true正在变成类似bool b = int(1)的东西,然后变成bool b = bool(int(1))而强制布隆导致and 0xff 1}}。我在c86函数的x86 epilogs中看到类似的东西返回bool(例如以test; setal结尾)而不是仅返回任意非零值。

这是窥视孔优化器会修复的代码......

答案 1 :(得分:1)

此代码

bool a = true;
bool c = false;

生成此IL程序集:

IL_0001:  ldc.i4.1    
IL_0002:  stloc.0     
IL_0003:  ldc.i4.0    
IL_0004:  stloc.1   

您可以在中间语言中看到,代码基本相同。抖动是如何转换的,或者为什么它不能有效地为这两者做并行代码是非常奇怪的。

(我把它作为答案而不是评论,因此我可以将讨论格式化为可读。)

答案 2 :(得分:0)

AND操作码还将根据英特尔手册(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)设置一些状态FLAGS(OF,CF,SF,ZF和PF)。如果没有函数中其余指令的上下文,很难猜出其目的是什么。