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吗? :)
布尔评估是'TEST'指令。如果结果为零,它会设置零标志,如果设置了零标志,则后面的JE指令(相当于'JZ')会跳转。也就是说,当禁用优化时,您必须查看由编译器生成的代码,这是浪费时间的很大一部分。你会看到许多不寻常的和次优的序列,它们不能反映程序员实际编写的内容*,或者*在拆卸代码时在真实世界中看到的内容。 –
'6 == 6'在编译时进行评估,然后将代码编译为“bool b = true;'。如果启用优化,编译器可能会将整个片段折叠为'bool b = false;' –
谢谢Igor&Cody。我对Igor提供的内容进行了说明,我想它是在编译时进行评估的。我只想看看它背后的布尔逻辑 – user3385390