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