• 汇编基础教程(二)——常用汇编指令之条件指令


    原文地址:http://www.tinpont.com/knowledge/assembly_instruction_condition.html

    ---------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------

    前面介绍的汇编指令大多都是围绕着数值的修改,这一小节我们来学习一下改变程序运行逻辑的部分指令——条件指令。

    此小节需要大家参照 汇编基础教程(一)——寄存器介绍(EFlags) 同步进行知识的温习与加深。



    JMP直接跳转指令(jump)


    此指令会直接修改EIP寄存器,格式如下:
    1
    JMP dst

    dst可以是地址、寄存器和立即数,执行后,下一句将会执行跳转到的地方,例如:
    1
    2
    3
    4
    00AFBD9F    MOV EAX,0    // EAX赋值为0
    00AFBDA4    JMP 00AFBDAB    // 跳到0x00AFBDAB处
    00AFBDA6    MOV EAX,1    // 此处因为被跳过,所以不会执行
    00AFBDAB    MOV EAX,2    // 最后EAX赋值为2



    CMP比较指令(compare)


    此指令仅设置寄存器EFlags相关位,格式如下:
    1
    CMP dst,src

    此指令与SUB指令类似,唯一的不同是此指令仅影响EFlags寄存器,不影响结果。例如:
    1
    2
    3
    4
    MOV EAX,1
    CMP EAX,2    // 执行后CF、PF、AF和SF位置1,EAX = 1
    CMP EAX,1    // 执行后CF、AF、SF位置0,PF和ZF位置1,EAX = 1
    CMP EAX,0    // 执行后CF、PF、AF、和SF位置0,EAX = 1



    TEST比较指令(test)


    此指令仅设置寄存器EFlags相关位,格式如下:
    1
    TEST dst,src

    此指令与AND指令类似,唯一的不同是此指令仅影响EFlags寄存器,不影响结果。例如:
    1
    2
    3
    4
    MOV EAX,1
    TEST EAX,2    // 执行后PF和ZF位置1,EAX = 1
    TEST EAX,1    // 执行后PF和ZF位置0,EAX = 1
    TEST EAX,0    // 执行后PF和ZF位置1,EAX = 1



    条件跳转指令


    此处需要结合EFlags寄存器标识进行学习。

    JA/JNBE 大于/不小于等于跳转指令(Jump if Above/Jump if Not Below or Equal)


    当EFlags寄存器CF位与ZF位同时为0时,进行跳转。


    JNA/JBE 不大于/小于等于跳转指令(Jump if Not Above/Jump if Below or Equal)


    当EFlags寄存器CF位为1或ZF位为1时,进行跳转。


    JB/JNAE/JC 小于/不大于等于跳转指令(Jump if Below/Jump if Not Above or Equal/Jump if Carry)


    当EFlags寄存器CF位为1时,进行跳转。


    JNB/JAE/JNC 不小于/大于等于跳转指令(Jump if Not Below/Jump if Above or Equal/Jump if Not Carry)


    当EFlags寄存器CF位为0时,进行跳转。


    JE/JZ 相等/为零跳转指令(Jump if Equal/Jump if Zero)


    当EFlags寄存器ZF位为1时,进行跳转。


    JNE/JNZ 不相等/不为零跳转指令(Jump if Not Equal/Jump if Not Zero)


    当EFlags寄存器ZF位为0时,进行跳转。


    JG/JNLE 大于/不小于等于带符号跳转指令(Jump if Greater/Jump if Not Less or Equal)


    当EFlags寄存器ZF位为0且SF位等于OF位时,进行跳转。


    JNG/JLE 不大于/小于等于带符号跳转指令(Jump if Not Greater/Jump if Less or Equal)


    当EFlags寄存器ZF位为1或SF位不等于OF位时,进行跳转。


    JL/JNGE 小于/不大于等于带符号跳转指令(Jump if Less/Jump if Not Greater or Equal)


    当EFlags寄存器SF位不等于OF位时,进行跳转。


    JNL/JGE 不小于/大于等于带符号跳转指令(Jump if Not Less/Jump if Greater or Equal)


    当EFlags寄存器SF位等于OF位时,进行跳转。

  • 相关阅读:
    对"对DllRegisterServer的调用失败,错误代码为0x8007005"的解决办法
    Struts FileUpload 异常处理之Processing of multipart/formdata request failed.
    Java设计模式之简单工厂模式(转载)
    [转]VS 2008 中文"试用版"变"正式版"方法
    XP系统中多用户,自动登陆(一)
    常见Flash无法播放现象处理
    [转]顺利迈出职业成功的第一步
    VS2005的BUG:Cannot convert type 'ASP.login_aspx' to 'System.Web.UI.WebControls.Login'
    OO设计原则
    ASPX页面生成HTML的方法
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314758.html
Copyright © 2020-2023  润新知