考虑一段C++代码:
int main() { volatile int a=0; if(!a) ++a; }
我使用g ++(Ubuntu 4.8.1-2ubuntu1~12.04)使用命令在amd64系统上编译它,g++ test.cpp -S -o test.S -masm=intel
并获得以下代码:
... mov eax, DWORD PTR [ebp-4] test eax, eax sete al test al, al je .L2 mov eax, DWORD PTR [ebp-4] ; don't use result of sete add eax, 1 mov DWORD PTR [ebp-4], eax .L2: mov eax, 0 ; also drop result of sete ...
这段代码真让我感到惊讶.起初我认为它与64位模式有关.但是当我尝试编译时-m32
,这个位保持不变.
为什么它检查eax
的是零,然后设置后重新检查结果再一次al
给ZF
?为什么不test eax,eax\n jne .L2
呢?