2017-05-14 11 views
0

現在、Assembly(X86、具体的には今)とMS VC++を使用して知識を豊富にするためにさまざまなコードラインをテストしています。 私はマシンが他のコンパイラ(GCC)に比べて、コードの異なる部分を生成する方法について無知だブール評価C++ asmコード

私は、次のASMコードが生じブールevalutionライン、全体で来ている:

void boolean_literals() { 
    /*true/false*/ 

01133A2E C6 45 FB 01   mov   byte ptr [b],1 
    bool b = 6 == 6; 
01133A32 0F B6 45 FB   movzx  eax,byte ptr [b] 
01133A36 85 C0    test  eax,eax 
01133A38 74 04    je   boolean_literals+2Eh (01133A3Eh) 
    if (b) { 
01133A3A C6 45 FB 00   mov   byte ptr [b],0 
     b = false; 
    } 

事はある - 私は実際にASMでブールの評価を見ることができない。

mov   byte ptr [b],1 

どれでもこの問題を解決する可能性があるコンパイラオプションまたはW/Eを? :)

+0

ブール評価は 'TEST'命令です。結果がゼロであればゼロフラグをセットし、ゼロフラグがセットされていれば次の 'JE'命令(' JZ'に相当)がジャンプします。つまり、最適化が無効になっているときにコンパイラによって生成されたコードを調べる必要があります。これは時間の無駄です。アセンブラプログラマがコードを逆アセンブルするときに現実世界で見ることができるものを実際に書くかどうかを反映しない、珍しい、準最適なシーケンスがたくさんあります。 –

+0

'6 == 6'はコンパイル時に評価され、コードは' bool b = true; 'のようにコンパイルされます。最適化を有効にすると、コンパイラはフラグメント全体を 'bool b = false; 'に縮退します。 –

+0

ありがとう、Igor&Cody私はイゴールが提示したものに驚いた。私はそれがコンパイル時に評価されると思う。私はちょうどそれの後ろにブール論理を見たいと思った – user3385390

答えて

0

ブール評価はここにある:

test  eax,eax 
je   boolean_literals+2Eh (01133A3Eh) 

Test行い:flags = eax and eaxZF=1 if eax == 0を設定します。
jeZF=1にジャンプし、ブール値テストを完了します。

あなたが最適化を有効にした場合、コンパイラは、最も可能性の高い:-)テストの結果は常に真であるため、完全にテストを省略することができます。この場合、次のコードがすべて必要です。

mov   byte ptr [b],1 //b = true 
関連する問題