我是靠谱客的博主 怕黑大侠,最近开发中收集的这篇文章主要介绍C语言函数栈帧解析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、什么是函数栈帧

 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.函数执行结束后系统进行了什么操作

总结

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

最后

以上就是怕黑大侠为你收集整理的C语言函数栈帧解析的全部内容,希望文章能够帮你解决C语言函数栈帧解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(112)

评论列表共有 0 条评论

立即
投稿
返回
顶部