对三目运算符的反汇编。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值