C语言--函数的调用调用过程,栈帧的创建和销毁。

函数在内存中到底是怎么经过一系列过程调用的呢?

指针寄存器esp,ebp
1.  首先先搞清楚函数调用中两个非常重要的指针寄存器esp,ebp。对这两个寄存器的一些理解:
esp为栈指针,用于指向栈的栈顶
ebp为帧指针,指向栈的栈底。

函数栈帧
2.  函数调用过程中需要开辟空间,用于本次函数的调用中临时变量的保存、现场保护。这块栈空间 我们称之为函数栈帧。
栈空间由高地址向低地址使用。

函数调用过程

当函数被调用的时候,执行如下操作:

1.将帧指针压入栈中:   push ebp
2.用ebp保存当前栈指针:mov ebp ,esp
3.栈指针自减,得到的内存被用来存储被调用函数的本地状态:sub esp ,4Ch
4.在函数调用时,第一个进栈的是被调用函数后的下一条指令的地址(函数调用语句的下一条可执行语句即call指令下一条指令的地址)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,先压形参b在压形参a ,然后是函数中的局部变量。注意静态变量是不入栈的。
5.函数调用完成时,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中下一条指令,程序由该点继续运行。

原文地址:https://www.cnblogs.com/lsiyu/p/8982990.html

时间: 2024-11-08 13:49:20

C语言--函数的调用调用过程,栈帧的创建和销毁。的相关文章

C函数的调用过程   栈帧

C语言中,每个栈帧对应着一个未运行完的函数.栈帧中保存了该函数的返回地址和局部变量. 首先,栈是从高地址向低地址延伸的.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址). 先来看一个代码 #include <stdio.h> void fun() {     int tmp = 10;     int*p = (int*)(*(&tmp + 1));     *(p - 1) = 20; } int main() {     int a = 0;

函数的调用过程——栈帧。

今天我们来看一下函数的调用过程与栈帧. 我们通过一段简单的代码和图示来介绍这个过程: #include<stdio.h> int add(int x,int y) { int z = x + y; return z; } int main() { int a = 0xaaaaaaaa; int b = 0xbbbbbbbb; int c = add(a, b); printf("run here!%d\n", c); return 0; } 将这个过程用图示表示出来: 在c

[Android Pro] 深入理解函数的调用过程——栈帧

cp :http://blog.csdn.net/x_perseverance/article/details/78897637 每一个函数被调用时,都会为函数开辟一块空间,这块空间就称为栈帧. 首先,我们了解一下不同种类的寄存器: (1)eax,ebx,ecx,edx :通用寄存器 (2)ebp:存放指向函数栈帧栈底的地址 (3)esp:存放指向函数栈帧栈顶的地址 (4)eip:程序计数器——保存程序当前正在执行指令的下一个指令的地址 接着我们以下面这段代码为例,深入到函数的调用过程中去: #

函数调用过程栈帧变化详解

http://www.cnblogs.com/fxplove/articles/2574451.html 数调用另一个词语表示叫作 过程.一个过程调用包括将数据和控制从代码的一部分传递到另一部分.另外,它还必须在进入时为过程的局部变量分配空间,并在推出时释放这些空间.而数据传递,局部变量的分配和释放通过操纵程序栈来实现.在了解本文章之前,您需要先对程序的进程空间有所了解,即对进程如何使用内存?如果你知道这些,下面的内容将是很easy的事情了.为了您的回顾还是将简单的分布图贴出来,便于您的回顾.

C语言函数的递归调用

一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层. [示例]用递归计算 n!.阶乘 n! 的计算公式如下: 根据公式编程: long factorial(int n){ long result; if(n==0 || n==1){ result = 1; }else{ result = factorial(n-1) * n; // 递归调用 } return result; } 这是一个典型的递归函数.调用factoria

函数的调用过程(栈帧)

1.什么是栈帧? 栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构.C语言中,每个栈帧对应着一个未运行完的函数.从逻辑上讲,栈帧就是一个函数执行的环境:函数调用框架.函数参数.函数的局部变量.函数执行完后返回到哪里等等.栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址). 2.Add()函数的调用过程 我们以Add()函数为例深入的研究一

C语言函数调用及栈帧结构

source:http://blog.csdn.net/qq_29403077/article/details/53205010 一.地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念,真正的代码及数据都存在物理内存中. 物理储存器是指实际存在的具体储存器芯片,CPU在操纵物理储存器的时候都把他们当做内存来对待,把他们看成由若干个储存单元组成的逻辑储存器,这个逻辑储存器就是我们所说的地址空间. 地址空间大小与逻辑储存器大小不一定相等. (2)进程的地址空间分布 进程的地址空间包括:

C函数调用机制及栈帧指针

转载: http://bbs.csdn.net/topics/90317145 http://blog.chinaunix.net/uid-26817832-id-3347227.html 帧指针 和栈指针到底是什么,有什么联系吗 FP帧指针指向帧头 SP栈指针指向栈顶 大部分现代计算机系统使用栈来给进程传递参数并且存储局部变量.栈是一种在进程映象内存的高地址内的后进先出(LIFO)的缓冲区.当程序调用一个函数时 一个新的"栈帧"会被创建.这个栈帧包含着传递给函数的各种参数和一些动态的

一段程序,认识栈帧

一.认识栈帧 先来看一段神奇的代码: (windows下,代码如下) #include<stdio.h> #include<stdlib.h> #include<Windows.h> void fun() {  printf("You Are Done\n");  Sleep(2000);  printf("Suppose The Computer Will Shut Down~~~~\n");    //上面这行如果换成syst