对三目运算符的反汇编。

来源:互联网 发布:电脑编程培训费用 编辑:程序博客网 时间:2024/05/28 16:26

之前一直没有对三目运算符反汇编过,本以为会很简单,几个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使用了超流水线技术,如果跳转的话,那么下面预先执行的指令都没用了,为了减少浪费,让指令顺序执行了。