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 0xff8 ビット bool への切り捨てであると思われます。確かに内部については十分に知りませんが、その後のbool b = trueようなものになりつつあると思われます.boolへの強制が. ゼロ以外の任意の値を返すだけでなく、bool を返す (たとえば で終わる) C++ 関数の x86 エピローグにも同様のことが見られます。bool b = int(1)bool b = bool(int(1))and 0xfftest; setal

これは、のぞき穴オプティマイザーが修正するようなコードです...

于 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   

中間言語を見るとわかるように、コードは本質的に同じです。ジッターがそれをどのように変換するのか、または 2 つのコードを効果的に並列化しない理由は非常に奇妙です。

(これをコメントではなく回答として入れたのは、ディスカッションを読みやすい形式にするためです。)

于 2012-11-23T04:21:59.583 に答える
0

ANDオペコードにより、Intelのマニュアル( http://www.intel.com/content/www/us/en/)に従って、ステータスFLAGSの一部(OF、CF、SF、ZF、およびPF)も設定されます。プロセッサ/アーキテクチャ-ソフトウェア-開発者-マニュアル.html)。関数内の残りの命令のコンテキストがないと、目的が何であるかを推測するのはかなり困難です。

于 2012-11-23T04:46:10.243 に答える