我目前正在测试各种代码行,以丰富我在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的编译器选项? :)
答案 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