zoukankan      html  css  js  c++  java
  • 用call和ret实现子程序

    ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作。具体的原理如下:
    ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器)

    call s的操作相当于:push ip
    jmp s(先将ip的值压栈,再跳转)

    retf的操作相当于:pop ip
    pop cs

    call dword ptr s相当于:push cs
    push ip
    这两组指令为我们编写含子函数的程序提供了便利,一般的格式如下:
    main:
    ………
    call s
    …….. a
    s: ……..
    call s1
    ………. b
    ret
    s1: ……….
    call s2
    ……… c
    ret
    s2: ……… d
    call s3
    ret
    s3: ……..
    ret
    分析以上的程序,假设call的下一条指令的偏移地址分别为:a、b、c、d
    随着程序的执行,ip指向call指令,CPU将这条指令放入指令缓冲器,执行上一条指令,然后ip指向下一条指令,ip = a。执行call指令,根据call的原理先执行a入栈,此时栈中的情况如下
    这里写图片描述
    然后跳转到s,执行到call指令处时,ip = b,b首先入栈,然后跳转到s1
    这里写图片描述
    执行到s1处的call指令时,ip = c,c入栈,然后跳转到s2
    这里写图片描述
    执行到s2处的call指令时,ip = d,d入栈,然后跳转到s3
    这里写图片描述
    执行到s3处的ret指令时,栈顶元素出栈,ip = d,程序返回到s2中,到ret时,ip = c,程序返回到s1,再次执行ret,ip = b,程序返回到s,执行ret,ip = a,程序返回到main中,接下来正常执行main中的代码,知道整个程序结束。

  • 相关阅读:
    JDBC_批量处理语句提高处理速度
    JDBC_获取插入记录的主键值
    JDBC_获取数据库连接
    SmartSprites 智能批量合并 CSS 雪碧图
    移动前端开发技巧摘录
    将已有项目提交到github/从github上pull到本地
    网页设计创新式布局与交互
    如何打好前端游击战
    jQuery Mobile十大常用技巧
    Javascript图片的懒加载与预加载
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725722.html
Copyright © 2011-2022 走看看