7

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

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
4

3 回答 3

2

我怀疑它and 0xff被截断为 8 位布尔值。我对内部结构知之甚少,无法确定,但我怀疑bool b = true正在变成这样的东西bool b = int(1),然后变成这样,这是bool b = bool(int(1))强制 bool 导致and 0xff. test; setal我在返回 bool (例如以 结尾)而不是仅仅返回任意非零值的 C++ 函数的 x86 结语中看到类似的事情。

这是窥视孔优化器将修复的那种代码......

于 2012-11-23T04:39:39.777 回答
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   

你可以在中间语言中看到,代码本质上是一样的。抖动是如何翻译的,或者为什么它不能有效地为两者并行代码是非常奇怪的。

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

于 2012-11-23T04:21:59.583 回答
0

根据英特尔手册 ( http://www.intel.com/content/www/us/en/),AND操作码还会导致设置一些状态标志(OF、CF、SF、ZF 和 PF)处理器/架构-软件-开发者-manuals.html)。如果没有函数中其余指令的上下文,很难猜测其目的是什么。

于 2012-11-23T04:46:10.243 回答