当将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?

下一篇: updating Backbone submodels after fetch/save