zoukankan      html  css  js  c++  java
  • 函数的调用过程

    计算机在执行调用函数的过程中,会根据函数完成一些工作,比如数据的传递(形参拷贝、返回值)、内存的分配和释放、执行控制和转移,这些操作需要通过形成一个栈帧来完成。

    栈帧(stack frame):栈帧就是函数运行的环境。每个函数在被调用的时候都会在栈区形成一个叫做栈帧的结构,这个结构保存了函数参数、局部变量、函数执行完后返回到哪里等一些数据

    汇编相关名词解释:

    1.ebp:栈底指针,esp:栈顶指针,栈帧指针只有一对

    2.call:用于保存当前指令的下一条指令并跳转到目标函数

    3.push:入栈,pop:出栈

    4.ptr:相当于指针

    5.mov:类似于赋值操作

    3.add:加法操作,sub:减法操作

    让我们看下面这段代码的栈帧是如何完成相关功能的:

    #include <stdio.h>  
    #include <windows.h>  
    int fun( int x, int y)  
    {  
        int c = 8;  
        return c;  
    }  
    int main()  
    {  
        int a = 2;  
        int b = 4;  
        int ret = fun(a, b);  
        printf("you should run here!
    ");  
        system("pause");  
        return 0;  
    }  

    下面是main函数调用fun函数之前的一些操作:

    1.参数拷贝(参数实例化)。

    2.保存当前指令的下一条指令,并跳转到被掉函数。

    这些操作在main函数中进行。

    接下来是调用fun函数并执行的一些操作:

    1.移动ebp、esp形成的新的栈帧结构。

    2.push压栈形成临时变量并执行相关操作。

    3.return一个值。

    这些都是在fun中进行。

     

    被调函数完成操作后返回到原函数中执行下一条指令:

    1.出栈(pop)。

    2.回复main函数的帧栈结构

    3.返回main函数

    这些操作也在fun中进行

    至此,在main中调用fun的整个过程已经完成。

    原博客:http://blog.csdn.net/jelly_9/article/details/53239718

  • 相关阅读:
    2019计蒜之道初赛第三场题解
    牛客小白月赛14 :部分题目总结
    CF-558:部分题目总结
    浙江省第十六届大学生ACM程序设计竞赛部分题解
    浙江省高职院校联合训练(一)
    CF-544:部分题目总结
    CF-552E-Two Teams
    CF-551:部分题目总结
    freemarker使用map替换字符串中的值
    freemarker使用map替换ftl中相关值
  • 原文地址:https://www.cnblogs.com/mikeCao/p/8474735.html
Copyright © 2011-2022 走看看