zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    黄金点游戏(结对项目)
    WORD COUNT
    企业级应用与互联网应用的区别
    问题
    软件工程期末学习总结
    自我介绍
    四则运算程序
    个人自评
    contenttype
    ubuntusaltstack
  • 原文地址:https://www.cnblogs.com/yfish/p/15342314.html
Copyright © 2011-2022 走看看