C/C++编译的程序占用内存的分配如图:

函数的调用过程(函数栈帧)   

程序在运行期间,地址空间一直都存在。

程序的地址空间不是内存,是虚拟地址空间。

接下来详细分析函数调用时在栈区形成栈帧的过程:

1. 栈 : 后进先出,进栈push,出栈pop.

2.寄存器:①通用计数器:eax ebx ecx ...

               ②栈顶寄存器:esp     栈底寄存器:ebp

               ③程序计数器:eip(pc指针)作用:与CPU互控,保存当前正在执行指令的下一条指令的地址。

2.栈帧:栈帧存入的是地址。

            函数的调用过程(函数栈帧)


为了深入学习函数和理解函数每一步实现都干了什么,那我们来深入研究函数的调用过程;

先看一段代码:用函数实现两个数的和。

[html] view plain copy
  1. <span style="color:#000066;">#include<stdio.h>  
  2. int Add(int x, int y)  
  3. {  
  4.     int z = 0;  
  5.     z = x + y;  
  6.     return z;  
  7. }  
  8. int main()  
  9. {  
  10.     int a = 1;  
  11.     int b = 2;  
  12.     int c = 0;  
  13.     c = Add(a, b);  
  14.     printf("%d\n", c);  
  15.     return 0;  
  16. }</span>  

 函数的调用过程(函数栈帧)

函数的调用过程(函数栈帧)

函数的调用过程(函数栈帧)

函数的调用过程(函数栈帧)

函数的调用过程(函数栈帧)

函数的调用过程(函数栈帧)

函数的调用过程(函数栈帧)

函数调用完成后,释放栈帧。

注意:栈是向下生长,当存入整形元素时,因为整形元素有四个地址,所以存入时取首地址,读取时从下向上依次读取四个地址。



以上就是函数的整个调用过程


相关文章: