当将bool设置为TRUE时,.Net程序集会添加多余的AND?
在VS2010中用.NET编写的以下代码:
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
我怀疑and 0xff
是截断到8位布尔。 我不太了解内部结构,但我怀疑bool b = true
变成了bool b = int(1)
,然后变成bool b = bool(int(1))
,这就是强制以bool导致and 0xff
。 我在C ++函数的x86 epilog中看到类似的东西,它返回bool(例如以test; setal
),而不是返回任意的非零值。
这是窥视孔优化器将修复的那种代码...
这个代码
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
你可以看到在中间语言中,代码基本上是一样的。 抖动是如何翻译的,或者为什么它不能有效地实现这两者的并行代码是非常奇怪的。
(我把这个作为回答,而不是评论,所以我可以将讨论的格式设置为可读。)
根据英特尔手册(http://www.intel.com/content/www/us/en/),AND操作码也会导致一些状态FLAGS被设置(OF,CF,SF,ZF和PF)处理器/架构,软件开发人员manuals.html)。 没有函数中其余指令的上下文,很难猜测它的目的是什么。
链接地址: http://www.djcxy.com/p/11497.html上一篇: .Net assembly adds superfluous AND when setting bool to TRUE?