汇编语言:比较指令、跳转指令、JCC的使用

 更新时间:2020年01月24日 08:56:57   转载 作者:eGanWo  
这篇文章主要介绍了汇编语言:比较指令、跳转指令、JCC的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、JMP 指令:修改EIP 当前运行的下一条指令

       JMP 寄存器/立即数
       目标类似:  mov  EIP,寄存器/立即数

       CALL指令:  调用函数  CALL 地址A/寄存器
       等价: 
               PUSH 地址B           ;保存call的下一条指令地址,压栈,作为返回值,
               MOV EIP,地址A/寄存器            ; 将函数首地址作为EIP

       RET指令:
       等价:LEA ESP,[ESP+4]       ; esp = esp + 4
                  MOV EIP,[ESP-4]     ;和 CALL相反,将CALL 指令的下一条指令地址赋值给EIP;

二、比较指令

       CMP  R/M,R/M/IMM
       该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。
       
       TEST指令:指令格式:TEST  R/M,R/M/IMM
        该指令在一定程序上和CMP指令是类似的(类似and),两个数值进行与操作,结果不保存,但是会改变相应标志位.
       常见用法:用这个指令,可以确定某寄存器是否等于0。(观察ZF)

三、JCC指令  16种跳转

       比较指令之后,一般都会有分支判断。
       根据标志位进行判断,下一步的分支。

JE, JZ 结果为零则跳转(相等时跳转) ZF=1
JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=0
JS 结果为负则跳转 SF=1
JNS 结果为非负则跳转 SF=0
JP, JPE 结果中1的个数为偶数则跳转 PF=1
JNP, JPO 结果中1的个数为偶数则跳转 PF=0
JO 结果溢出了则跳转 OF=1
JNO 结果没有溢出则跳转 OF=0
JB, JNAE 小于则跳转 (无符号数) CF=1
JNB, JAE 大于等于则跳转 (无符号数) CF=0
JBE, JNA 小于等于则跳转 (无符号数) CF=1 or ZF=1
JNBE, JA 大于则跳转(无符号数) CF=0 and ZF=0
JL, JNGE 小于则跳转 (有符号数) SF≠ OF
JNL, JGE 大于等于则跳转 (有符号数) SF=OF
JLE, JNG 小于等于则跳转 (有符号数) ZF=1 or SF≠ OF
JNLE, JG 大于则跳转(有符号数) ZF=0 and SF=OF

四、思考

1、CALL执行时堆栈有什么变化?EIP有变化吗?
      Call执行时,保存了cal函数首地址到EIP,同时将Call函数的首地址压栈; 
2、RET执行时堆栈有什么变化?EIP有变化吗?
      和Call的过程相反,将前面Call的下一条指令地址,从堆栈中取出来作为EIP。
3、使用汇编指令修改标志寄存器中的某个位的值,实现JCC的十六种跳转.
    不允许在OD中通过双击的形式修改标志寄存器.
    要通过汇编指令的执行去影响标志位,能用CMP和TEST实现的优先考虑.
     见上面的表格; 

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

相关文章

  • 汇编用串检测scasb寻找数的位置实现

    汇编用串检测scasb寻找数的位置实现

    这篇文章主要介绍了汇编用串检测scasb寻找数的位置实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 使用汇编语言实现if else 循环函数调用的具体方法

    使用汇编语言实现if else 循环函数调用的具体方法

    这篇文章主要介绍了使用汇编语言实现if else 循环函数调用的具体方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • GNU ARM汇编语法原理及操作解析

    GNU ARM汇编语法原理及操作解析

    这篇文章主要介绍了GNU ARM汇编语法原理及操作解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 从Go汇编角度解读for循环的问题

    从Go汇编角度解读for循环的问题

    Go常用的遍历方式有两种:for和for-range。这篇文章主要介绍了从Go汇编角度解读for循环的两个疑点,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 使用汇编语言编写一条简单的贪吃蛇的实现

    使用汇编语言编写一条简单的贪吃蛇的实现

    这篇文章主要介绍了使用汇编语言编写一条简单的贪吃蛇的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 汇编跳转指令使用总结

    汇编跳转指令使用总结

    这篇文章主要介绍了汇编跳转指令使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 汇编语言软件延时1s的实现方法

    汇编语言软件延时1s的实现方法

    这篇文章主要介绍了汇编语言软件延时1s的实现方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)

    汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。这篇文章主要介绍了汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作,需要的朋友可以参考下
    2020-01-01
  • Go 中的循环是如何转为汇编的(方法详解)

    Go 中的循环是如何转为汇编的(方法详解)

    这篇文章主要介绍了Go 中的循环是如何转为汇编的,本文通过循环的汇编代码给大家讲解的非常详细,代码简单易懂,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 8086汇编语言nasm版本

    8086汇编语言nasm版本

    这篇文章主要介绍了8086汇编语言nasm版本,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01

最新评论