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

  • 相关阅读:
    Java中判断两个列表是否相等
    chrome:插件、跨域、调试....
    mac 开发环境采坑
    webpack升级踩坑
    js-使用装饰器去抖
    React setState 笔试题,下面的代码输出什么?
    react 解决:容器组件更新,导致内容组件重绘
    centos使用ngnix代理https
    javascript 理解继承
    js 数据监听--对象的变化
  • 原文地址:https://www.cnblogs.com/mikeCao/p/8474735.html
Copyright © 2011-2022 走看看