zoukankan      html  css  js  c++  java
  • 常用汇编指令及其影响的标志位

    加法指令 ADD (addition)

    指令对标志位的影响:

                         CF=1   最高有效位向高位有进位

                         CF=0   最高有效位向高位无进位

                         OF=1   两个同符号数相加(正数+正数  负数+负数),结果符号与其相反。

                         OF=0   两个不同符号数相加,或同符号数相加,结果符号与其相同。

     

    带进位加法指令 ADC (add with carry)

    指令对标志位的影响:

                         CF=1   最高有效位向高位有进位

                         CF=0   最低有效位相高位无进位

                         OF=1   两个同符号数相加,结果符号与其相反,

                         OF=0   两个同符号数相加,或同符号相加,结果符号与其相同

     

    1指令 INC (increament)

    指令对标志位的影响:

                         CF无影响

                         OF=1   两个同符号数相加,结果符号与其相反,

                         OF=0   两个同符号数相加,或同符号相加,结果符号与其相同。

     

    减法指令 SUB (subtract)

    指令对标志位的影响:

                         CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                         CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                         OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                         OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

     

    带借位减法指令 SBB (subtract with borrow)

    指令对标志位的影响:

                         CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                         CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                         OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                         OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

     

    1指令 DEC (decrement)

    指令对标志位的影响:

     

                         CF无影响

                         OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                         OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

                       

    比较指令 CMP (compare)

    指令对标志位的影响:

                         CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                         CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                         OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                         OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

     

    求补指令 NEG (negate)

    指令对标志位的影响:

     

                         CF=1  不为0的操作数求补时

                         CF=0  为0的操作数求补时

                         OF=1    操作数为-128(字节运算)或操作数为-32768(字运算)

                         OF=0    当求补运算的操作数不为-128(字节)或-32768(字)时

    无符号乘法指令 MUL (unsigned multiple)    有符号乘法指令 IMUL(signed muliple)

    指令对标志位的影响:乘法指令只影响标志位CFOF,其他条件码位无定义

                         MUL指令的条件码设置为:

                         CF OF=0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))

                         CF OF=1 1 乘积的高一半不为0

                         IMUL指令的条件码设置为:

                         CF OF=0 0 乘积的高一半为低一半的符号扩展.

                         CF OF=1 1 其他情况

     

    无符号数除法 DIV (unsigned divide)     带符号数除法 IDIV (singed divide)

    指令对标志位的影响:不影响条件码。   

     

    逻辑与 AND (logic and)

    指令对标志位的影响:

     

                         指令执行后 CF  OF 置零,AF无定义。

                         PF=1 结果操作数中1的个数为偶数时置1

                         PF=0 结果操作数中1的个数为奇数时置0

     

    逻辑或 or (logic or)

    指令对标志位的影响:

     

                         令执行后 CF  OF 置零,AF无定义。

                         PF=1 结果操作数中1的个数为偶数时置1

                         PF=0 结果操作数中1的个数为奇数时置0

     

    逻辑非 NOT (logic not)

    指令对标志位的影响:对标志位无影响

     

    异或 XOR (exclusice or)

    指令对标志位的影响:

     

                         令执行后 CF  OF 置零AF无定义。

                         PF=1 结果操作数中1的个数为偶数时置1

                         PF=0 结果操作数中1的个数为奇数时置0

     

    测试指令 TEST

    指令对标志位的影响:

     

                         令执行后 CF  OF 置零AF无定义。

                         PF=1 结果操作数中1的个数为偶数时置1

                         PF=0 结果操作数中1的个数为奇数时置0

     

    逻辑左移 SHL (shift logical left)

    指令对标志位的影响: CF=移入的数值

                         OF=1 cnt=1时,移动后最高位的值发生变化。

                         OF=0 cnt=1时,移动时最高位的值未发生变化。

     

    逻辑右移 SHR (shift logical right)

    指令对标志位的影响:CF=移入的数值

                         OF=1 cnt=1时,移动后最高位的值发生变化。

                         OF=0 cnt=1时,移动时最高位的值未发生变化。

     

    算术左移 SAL (shift arithmetic left)

    指令对标志位的影响:CF=移入的数值

                         OF=1 cnt=1时,移动后最高位的值发生变化。

                         OF=0 cnt=1时,移动时最高位的值未发生变化。

     

    算术右移SAR (shift arithmetic right)

    指令对标志位的影响:CF=移入的数值

                         OF=1 cnt=1时,移动后最高位的值发生变化。

                         OF=0 cnt=1时,移动时最高位的值未发生变化。

     

    循环左移 ROL (rotate left)

    指令对标志位的影响:CF=移入的数值

                         OF=1 cnt=1时,移动后最高位的值发生变化。

                         OF=0 cnt=1时,移动时最高位的值未发生变化。

     

    循环右移 ROR (rotate right)

    指令对标志位的影响:CF=移入的数值

                         OF=1 cnt=1时,移动后最高位的值发生变化。

                         OF=0 cnt=1时,移动时最高位的值未发生变化。

     

    带进位的循环左移 RCL (rotate left through carry)

    指令对标志位的影响:CF=移入的数值。

                         OF=1 cnt=1时,移动后最高位的值未发生变化。

                         OF=0 cnt=1时,移动后最高位的值发生变化。

                         SFZFPF标志位不受影响。

     

    带进位的循环右移 RCR (rotate right through carry)

    指令对标志位的影响:CF=移入的数值。

                         OF=1 cnt=1时,操作数最高位的值未发生变化。

                         OF=0 cnt=1时,操作数最高位的值发生变化。

                         SFZFPF标志位不受影响。

     

    串传送 MOVSB / MOVSW (move string byte/word)

    指令对条件码的影响:不影响条件码。

     

    存串 STOSB / STOSW (stroe from string byte/word)

    指令对条件码的影响:不影响条件码。

     

    取串LODSB / LODSW (load from string byte/word)

    指令对条件码的影响:不影响条件码。

     

    串比较 CMPSB / CMPSW (compare string byte/word)

    指令对条件码的影响:

                         CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                         CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                         OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                         OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

     

    串扫描 SCASB / SCASW (scan string byte / word)

    指令对条件码的影响:

                         CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

                         CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

                         OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

                         OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

     

    条件转移指令

     

    指令的汇编格式及功能    根据条件码的值转移:

    49JZ(JE) OPR         ZF=1

    50JNZ(JNE) OPR      ZF=0

    51JS OPR             SF=1

    52JNS OPR           SF=0

    53JO OPR             OF=1

    54JNO OPR          OF=0

    55JP OPR             PF=1

    56JNP OPR           PF=0

    57JC OPR             CF=1

    58JNC OPR           CF=0

     

    比较两个无符号数,根据比较的结果转移

    59JB(JNAE,JC)   OPR   CF=1            被减数小于减数则转移

    60JNB(JAE,JNC) OPR    CF=0            被减数大于或等于减数则转移

    61JBE(JNA) OPR        CFZF=1       被减数小于或等于减数则转移

    62JNBE(JA) OPR        CFZF=0       被减数大于减数则转移

     

    比较两个带符号数,根据比较结果转移

    63JL/JNGE OPR       SF异或OF=1           被减数小于减数则转移   

    64JNL/JGE           SF异或OF=0               被减数不小于减数则转移

    65JLE/JNE           (SF异或OF)ZF=1     被减数不大于减数则转移

    66JNLE/JG           (SF异或OF)ZF=0     被减数大于减数则转移

     

    根据CX寄存器的值转移

    67JCXZ              (CX)=0               CX内容为零 则转移

    最后,说一下关于一个指令对于两个相同操作数的情况(PS:之前一直感到困惑,为啥test经常操作两个相同的操作数,结合指令的对于标志位的影响就能明白这样做的意图,下面我来举例说明)

     

    例子:

    :00401098 50 push eax 
    :00401099 8BCF mov ecx, edi 
    :00401056 52  push edx 
    :00401057 8BC8 mov ecx, eax 
    :00401059 E8021D0100 call 00412D60 
    :0040105E 85C0 test eax, eax 
    :00401060 7421 je 00401083

    标红的这句test比较了eax的值,将会影响标志位SF、ZF、和PF标志位,并将CF和OF如果eax为0则标志位SF=0,ZF=1,PF=0,CF,0F=0.

     

    由于ZF=0,所以下一句将会执行跳转。说白了,这里test指令就是用来检测eax是否为零的!

    附上各个标志位含义

    CF:    进位标志符号比         排在第0位
    PF:    奇偶标志            排在第2位
    AF:    辅助进位标志          排在第4位
    ZF:    零标志             排在第6位
    SF:    符号标志            排在第7位
    TF:    追踪标志             排在第8位
    IF:    中断允许标志            排在第9位
    DF:    方向标志             排在第10位
    OF:    溢出标志             排在第11位

     

     

     

     

     

     

  • 相关阅读:
    【解压缩命令】 -费元星
    【虚拟机取得该虚拟机的所有权失败】--费元星
    solr 常见的问题整理 -费元星
    oracle 建立一个视图,然后授权其他用户访问
    虚拟机安装win7 64位-完美解决-费元星
    solr 学习
    CentOS安装JDK1.7
    Nginx+Tomcat多站点访问默认主页问题-狒狒完美解决-Q9715234
    pip 安装时提示uvloop/loop.c:20:10: fatal error: Python.h解决
    MySQL锁总结
  • 原文地址:https://www.cnblogs.com/2f28/p/9747026.html
Copyright © 2011-2022 走看看