我目前正在测试各种代码行,以丰富我在汇编(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?:)
布尔值计算在这里:
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