• 分类

  • 重置

汇编跳转指令使用总结

    虽然jmp指令提供了控制转移,但是它不允许进行任何复杂的判断。80×86条件跳转指令提供了这种判断。条件跳转指令是创建循环和实现其他条件执行语句。条件跳转指令检查一个或多个标志位,判断它们是否匹配某个特殊条件(就像setcc指令):如果标志匹配成功,该指令就将控制转移到目标位置;如果匹配失败,CPU忽略该条件跳转指令而继续执行下一条指令。条件跳转指令有一个限制:目标标号的位置必须在跳转指令本身附近32768字节范围内,这通常对应着8000~32000条机器指令。一般情况下不会超过这种限制。

    用自己的话总结:条件跳转指令是指jz,jg..等等指令,这些指令跳转方式是根据标志位的状态进行跳转,而设置这些标志的常见指令为cmp和test指令,所以他们经常搭配使用(应该是必须的)。即跳转指令前一行要吗有cmp指令要吗有test指令。

    汇编标志位:

    标志名                          标志 1              标志 0

    OF (溢出标志)                 OV                  NV

    DF  (方向标志)                                         UP                  DN

    IF (中断标志)                 DI                  EI

    SF (符号标志位)               PL                  NG

    ZF (零标志)                   NZ                  ZR

    AF (辅助进位标志位)           NA                  AC

    PF (奇偶标志)                 PO                  PE

    CF (进位标志)                 NC                  CY

    反汇编窗口,对应的标志位(双击后面的数字可改变其状态)

    Test和cmp指令的区别

    test属于逻辑运算指令
    Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
    举例:
    Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
    test ecx, ecx
    jz somewhere
    如果ecx为零,设置ZF零标志为1,Jz跳转

    ——————————————–

    CMP属于算术运算指令
    CMP比较.(两操作数作减法,仅修改标志位,不回送结果). 
    cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
    举例:
    Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
    Jz ****;          如果设置了零标志就跳转

    ============================================

    得出的结论
    test逻辑与运算结果为零,就把ZF(零标志)置1;
    cmp 算术减法运算结果为零,就把ZF(零标志)置1.

    指 令

    描 述

    条 件

    别 名

    相 反 指 令

    JC

    如果进位位被置位则跳转

    进位标志=1

    JB,JNAE

    JNC

    JNC

    如果进位位没有置位则跳转

    进位标志=0

    JNB,JAE

    JC

    JZ

    如果0标志被置位则跳转

    0标志=1

    JE

    JNZ

    JNZ

    如果0标志没有置位则跳转

    0标志=0

    JNE

    JZ

    指 令

    描 述

    条 件

    别 名

    相反指令

    JS

    如果符号位被置位则跳转

    符号标志=1

    JNS

    JNS

    如果符号位没有被置位则跳转

    符号标志=0

    JS

    JO

    如果溢出标志置位则跳转

    溢出标志=1

    JNO

    JNO

    如果溢出标志没有置位则跳转

    溢出标志=0

    JO

    JP

    如果奇偶校验位被置位则跳转

    奇偶校验标志=1

    JPE

    JNP

    JPE

    如果奇偶校验位为偶校验则跳转

    奇偶校验标志=1

    JP

    JPO

    JNP

    如果奇偶校验位没有被置位则跳转

    奇偶校验标志=0

    JPO

    JP

    JPO

    如果奇偶校验位为奇校验则跳转

    奇偶校验标志=0

    JNP

    JPE

    使用无符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JA

    如果超过(>)则跳转

    进位标志=0,0标志=0

    JNBE

    JNA

    JNBE

    如果不低于或等于(不 <=)则跳转

    进位标志=0,0标志=0

    JA

    JBE

    JAE

    如果超过或等于(>=)则跳转

    进位标志=0

    JNC,JNB

    JNAE

    JNB

    如果不低于则跳转(不 <)

    进位标志=0

    JNC,JAE

    JB

    JB

    如果低于(<)则跳转

    进位标志=1

    JC,JNAE

    JNB

    JNAE

    如果不超过或等于(不>=)则跳转

    进位标志=1

    JC,JB

    JAE

    JBE

    如果低于或等于(<=)则跳转

    进位标志=1或0标志=1

    JNA

    JNBE

    JNA

    如果不超过(不>)则跳转

    进位标志=1或0标志=1

    JBE

    JA

    JE

    如果相等(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不相等(<>)则跳转

    0标志=0

    JNZ

    JE

    使用有符号数比较的JCC指令

    指 令

    描 述

    条 件

    别 名

    相反指令

    JG

    如果大于(>)则跳转

    符号标志=溢出标志或0标志=0

    JNLE

    JNG

    JNLE

    如果小于或等于(<=)则跳转

    符号标志=溢出标志或0标志=0

    JG

    JLE

    JGE

    如果大于或等于(>=)则跳转

    符号标志=溢出标志

    JNL

    JGE

    JNL

    如果不小于(不<)则跳转

    符号标志=溢出标志

    JGE

    JL

    JL

    如果小于(<)则跳转

    符号标志<>溢出标志

    JNGE

    JNL

    JNGE

    如果大于或等于(>=)跳转

    符号标志<>溢出标志

    JL

    JGE

    JLE

    如果小于或等于(<=)跳转

    符号标志<>溢出标志或0标志=1

    JNG

    JNLE

    JNG

    如果不大于(不>)则跳转

    符号标志<>溢出标志或0标志=1

    JLE

    JG

    JE

    如果等于(=)则跳转

    0标志=1

    JZ

    JNE

    JNE

    如果不等于(<>)则跳转

    0标志=0

    JNZ

    JE

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持lingkb。