neg指令和sbb指令

遇到不懂的指令,不用到网上查,自己用OD测试一下就知道了。

neg a

neg指令执行的操作是把a的每个二进制位取反之后再加1。效果就是数学上的求相反数,比如neg 3的结果就是-3,neg -3的结果就是3. neg 0的结果就是0

经过测试发现,neg a   不管a是正数还是负数,都会置CF为1这就很奇怪,按照先按位取反再加1的操作来说,更本没产生进位啊,为什么要置CF为1呢?

后来查询到intel手册。

neg a这个操作相当于0-a,这个过程会产生借位,借位了那么CF就是1了。

总结一下用neg指令可以确定一个操作数是不是0。是0则CF=0,不是0则CF=1.

 

 

sbb指令是带借位的减法

sbb a,b 执行的操作是a-b-CF

看一下neg和sbb配合的指令

neg a

sbb a,a

如果a是0,那么neg之后结果是CF=0 sbb之后的结果就是0-0-0=0

如果a是非0,那么neg之后结果是CF=1,sbb之后的结果就是a-a-1=-1

 

 

看一下仙剑4战斗系统里面一段代码

PAL4.exe+12DFA4 - E8 17650500 - call PAL4.exe+1844C0 { 是5的时候调用call
}
PAL4.exe+12DFA9 - F6 D8 - neg al
PAL4.exe+12DFAB - 1B C0 - sbb eax,eax
PAL4.exe+12DFAD - 40 - inc eax
PAL4.exe+12DFAE - C3 - ret
PAL4.exe+12DFAF - 32 C0 - xor al,al
PAL4.exe+12DFB1 - C3 - ret

调用完一个函数之后拿到返回值用neg和sbb指令来判断函数结果是0还是非0,如果是0,那么sbb之后 eax的结果还是0 inc eax之后结果是1,如果是非0,那么sbb之后

eax的结果是-1,inc eax结果之后就是0。

所以这段代码的意思是调用一个函数,如果结果是0,那么返回1,如果是非0,那么返回0

 

posted @ 2021-09-27 11:51  eatwhat  阅读(1391)  评论(0编辑  收藏  举报