之前一直没有对三目运算符反汇编过,本以为会很简单,几个cmp,jg,jl之类的,昨天反汇编了一下,大吃一惊。
int b=a>5?2:20;
反汇编之后:
0040102F xor eax,eax
00401031 cmp dword ptr [ebp-4],5
00401035 setle al
00401038 dec eax
00401039 and al,0EEh
0040103B add eax,14h
0040103E mov dword ptr [ebp-8],eax
看了好久才看明白,大致流程是这样的:
先让a和5比较,根据比较结果,设置al的数值(setle 为:大于等于则置位),之后在进行减一操作。在dec eax指令执行完毕之后,如果a的值小于等于5,eax里面的数值是0xffffffff,否则是零。然后在进行and操作,如果a的值小于等于5,and之后eax值为-18,否则为0,然后再加上20.
之所以这样,不用跳转指令,估计是因为CPU使用了超流水线技术,如果跳转的话,那么下面预先执行的指令都没用了,为了减少浪费,让指令顺序执行了。