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を? :)
ブール評価は 'TEST'命令です。結果がゼロであればゼロフラグをセットし、ゼロフラグがセットされていれば次の 'JE'命令(' JZ'に相当)がジャンプします。つまり、最適化が無効になっているときにコンパイラによって生成されたコードを調べる必要があります。これは時間の無駄です。アセンブラプログラマがコードを逆アセンブルするときに現実世界で見ることができるものを実際に書くかどうかを反映しない、珍しい、準最適なシーケンスがたくさんあります。 –
'6 == 6'はコンパイル時に評価され、コードは' bool b = true; 'のようにコンパイルされます。最適化を有効にすると、コンパイラはフラグメント全体を 'bool b = false; 'に縮退します。 –
ありがとう、Igor&Cody私はイゴールが提示したものに驚いた。私はそれがコンパイル時に評価されると思う。私はちょうどそれの後ろにブール論理を見たいと思った – user3385390