布尔评估c ++ asm代码

时间:2017-05-14 12:58:41

标签: assembly x86 boolean

我目前正在测试各种代码行,以丰富我在Assembly(X86,特别是现在)和使用MS VC ++方面的知识。 关于机器如何生成代码的不同部分与其他编译器(gcc)相比,我一无所知

我遇到了一个布尔评估线,它产生了以下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的编译器选项? :)

1 个答案:

答案 0 :(得分: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