• 用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中的代码,知道整个程序结束。

  • 相关阅读:
    第六次作业SSM
    第五次作业——MVC2项目实践
    第四次作业——JSP显示新闻
    第三次作业——servlet应用
    第二次作业——模仿登录页面
    第一次作业——Java web基础
    Alpha项目测试
    作业三
    第二次作业
    第一次阅读作业-201731062609-庞斌
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725722.html
Copyright © 2020-2023  润新知