2017-05-14 58 views
0

我目前正在测试各种代码行,以丰富我在Assembly(X86,特别是现在)和使用MS VC++中的知识。 我无言以对关于该机相比其他的编译器(GCC)布尔评估C++ asm代码

我遇到一个布尔评价;线,这就造成了以下ASM代码是如何生成的代码的不同部分:

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。我对Igor提供的内容进行了说明,我想它是在编译时进行评估的。我只想看看它背后的布尔逻辑 – user3385390

回答

0

布尔评价是在这里:

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

Test执行:flags = eax and eax将设置ZF=1 if eax == 0
je将跳上ZF=1从而完成布尔测试。

如果启用了优化,编译器将最有可能:-)发现,你的测试结果始终是真实的,因此,将与测试完全免除。在这种情况下,下面的代码就是所需要的。

mov   byte ptr [b],1 //b = true