tqsheng

go.....
随笔 - 366, 文章 - 18, 评论 - 101, 引用 - 0
数据加载中……

NEG+SBB指令组合的用处

NEG+SBB指令组合的用处

在逆向遇到NEG+SBB指令的组合,不明白原因,上网一查,找到了.嘿嘿!
mov     ebx, eax
neg      ebx
push    esi
sbb      bl, bl

注:Intel处理器的文档中声明NEG指令除了对操作数作符号取反外,它还要根据操作数的值设置CF标志位的值。如果执行NEG指令时操作数为0,则CF将被置为0。如果操作数为非零,则CF将被置为1。

NEG是一个简单的取反指令,用来对操作数的算术符号取反——有时候也称它为2的补码(two’s complement。译注:1的补码与NOT指令对应,是逻辑取反指令)。NEG用C描述的伪代码:

Result = -(Operand);

SBB是一条带借位的减法指令,这就是说SBB将第二个操作数(即右操作数)加上标志位CF,然后将结果用第一个操作数来减。SBB用C描述的伪代码:

Operand1 = Operand1 - (Operand2 + CF);

 

在上面的指令中NEG的作用应该就是注中的,根据操作数来设置CF标志位的值,如果EBX为0,那么CF将被置为0,如果EBX为非零,则CF将被置为1.然后结合SBB,我们可以将以上4条指令理解为,当EBX等于0时,BL将等于0;EBX大于0时,BL将等于-1.

 

参考:Reversing:逆向工程揭密-附录A揭密代码结构(4)

// 对返回数进行处理,这是编译器优化的结果,翻译成C可能是
// if (eax)
// return 1 ;
// else
// return 0 ;
// 求反.执行NEG指令时操作数为0,则CF将被置为0。如果操作数为非零,则CF将被置为1
/*41A72D*/ NEG EAX
// 高位借位减法,EAX的值取决于前面的neg指令。对同一个操作数执行减运算,
// 即用EAX寄存器减去EAX,如果不考虑标志位CF的话,这条指令在数学上是没有任何意义的。
// 因为将CF加到了第二个操作数上,所以结果只取决于CF。如果“CF == 1”,那么EAX将变成-1
/*41A72F*/ SBB EAX,EAX
/*41A731*/ NEG EAX // 如果EAX=0,非0可能是-1了,取反后就返回1

posted on 2008-09-19 10:52 tqsheng 阅读(810) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理