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

  • 相关阅读:
    js-AOP
    jQueryUI之autocomplete
    nginx安装配置
    oracle结构语法
    ajax/表单提交 多个相同name的处理方法
    ES6模块化
    docker运维
    帆软报表
    oracle锁表
    香港到大陆IPLC节点故障
  • 原文地址:https://www.cnblogs.com/yfish/p/15342314.html
Copyright © 2011-2022 走看看