一段代码的反汇编

C代码:

int main(void)

{

     if(FindWindow(NULL,"计算器"))

     return 1;

     else

     return 5;

}

 用VC6编译,设置优化选项Maximize Speed。

反汇编代码如下

 

push 406030

push 0

call    dword ptr[40509c]  ;FindWindowA

 

neg   eax

sbb   eax,eax

and   al,0FC

add   eax,5

retn

 

首先,代码用neg指令检验eax是否是0,结果放在CF标志位中。sbb指令讲目的操作数减去源操作数,再减去借位CF,结果送目的操作数。"sbb eax,eax",相当于:

if(eax)

  CF=1

else

  CF=0

eax=-CF

接下来与0FC相与,为-4或0,然后+5就得到结果~

 

所以要完成两个分支值为a与b汇编优化为

neg   eax

sbb   eax,eax

and   al,a-b

add   eax,a

retn

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值