C语言函数栈帧解析

编辑: admin 分类: c#语言 发布时间: 2021-12-12 来源:互联网
目录
  • 一、什么是函数栈帧
    •  1.寄存器:
    • 2.函数栈帧
    •  3.栈帧的作用和维护
    •  4.栈帧结构
  • 二、函数栈帧的创建
    • 1.汇编代码
      • 2.main函数
    • 2.栈帧创建:
      • 3.步骤
        • 4.ADD函数栈帧的创建
        • 三.函数栈帧的销毁
          • 1.汇编语言
          • 四.了解
            • 1.函数传参
              •  2.函数返回值如何返回
                •  3.函数中变量如何初始化和赋值
                • 总结

                  一、什么是函数栈帧

                   1.寄存器:

                  eax, ebx, ecx ...

                  ebp - 存放了指向函数栈帧栈底的地址

                  esp - 存放了指向函数栈帧栈顶的地址

                  2.函数栈帧

                  函数被调用时,系统会在栈区为该函数开辟一块栈空间,这个栈空间就是该函数的函数栈帧。

                  以main函数的调用为例

                   3.栈帧的作用和维护

                  栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。从逻辑上讲,栈帧为一个函数提供了执行环境。

                  栈是先用高地址再用低地址,栈帧控制和保存了一个函数所需要的各种信息。

                  栈帧的维护离不开ebp和esp寄存器,ebp存放了指向栈帧的栈底地址的指针,esp则存放指向栈顶地址的指针。

                   4.栈帧结构

                  以main函数为例:

                   

                  二、函数栈帧的创建

                  环境为VS2019

                  ​
                  ​#include<stdio.h>
                  int ADD(int x, int y)
                  {
                      int z=0;
                      z=x+y;
                  	return z;
                  } 
                  int main()
                  {
                  	int a = 10;
                  	int b = 20;
                  	int c = 0;
                  	c = ADD(a, b); 
                  	return 0;
                  }​

                  1.汇编代码

                  要研究函数栈帧我们要研究c程序的汇编代码。如图所示:

                   

                  2.main函数

                   

                  2.栈帧创建:

                   

                  3.步骤

                   

                   

                   

                   

                   

                  main函数的函数栈帧的创建和数据初始化就完成了。

                  4.ADD函数栈帧的创建

                   add函数栈帧的创建和main函数栈帧创建是一样的,值得注意的是,ADD函数执行结束后的返回值保存在了寄存器eax中,就是避免ADD函数栈帧销毁时,主函数无法访问ADD返回值。由此可见函数返回值是如何返回的。

                  三.函数栈帧的销毁

                  1.汇编语言

                  四.了解

                  1.函数传参

                   2.函数返回值如何返回

                   3.函数中变量如何初始化和赋值

                  4.函数执行结束后系统进行了什么操作

                  总结

                  本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注海外IDC网的更多内容

                  【文章原创作者:http://www.yidunidc.com/st.html转发请说明出处】