以下用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
答案 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)。如果没有函数中其余指令的上下文,很难猜出其目的是什么。