初学函数栈帧

本文介绍了CPU寄存器的作用,特别是EBP和ESP在维护函数栈帧中的角色。通过分析C语言代码,展示了函数栈帧的创建和销毁过程,包括参数压栈、栈帧初始化及返回。深入理解这一过程对于了解程序执行和内存管理至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

萌新编写,大佬勿喷

寄存器

在学习函数栈帧之前,我们要先了解寄存器.

寄存器是集成再cpu上存储数据的一小块区域,读写速度非常快用来存储指令,数据和地址.例如:ebp,esp,eax,ebx.其中ebp和esp用来维护函数栈帧

栈区

c语言中内存分配的栈区用来存储函数,随着函数的创建和销毁而使用.

栈区从高地址向低地址使用.

 图片来自大佬博客比我写的详细很多函数栈帧(详细图解)_ZHOUZH的博客-优快云博客_函数栈帧一、栈 简单来说栈是一块由函数运行而临时占用的内存区域,其主要特点有:一个限定表尾进行删除(出栈)和插入(入栈)操作的线性表,其过程类似与压子弹与退子弹。一个由系统自动分配的内存空间。用于存储函数内部的局部变量、方法调用、函数传参数值等。由高地址向低地址生长。...https://blog.youkuaiyun.com/qq_41412237/article/details/119489211?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164110854416780271997401%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164110854416780271997401&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-119489211.pc_search_insert_es_download_v2&utm_term=%E5%87%BD%E6%95%B0%E6%A0%88%E5%B8%A7&spm=1018.2226.3001.4187

我们用一段非常简单的代码学习函数栈帧的创建和销毁的过程.

#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;
}

在此之前我们要知道main函数也是要被别的函数调用的

main函数被__tmainSRTStartup函数调用

寄存器ebp维护的是栈底(栈底指针)esp维护栈顶(栈顶指针)

在main函数被调用之前ebp,esp维护的是__tmainSRTStartup函数,

 然后程序调用main函数开始执行main函数中的指令

我们转到反汇编

 

 接着创建变量进行赋值

 

 ​​​​​​​然后开始进入函数

先将传递  的参数压栈,再将call指令下一条指令的地址压栈

 

之后创建函数栈帧

蓝色是调整栈顶指针和栈底指针,绿色是初始化函数

 

 

 

 

 ​​​​​​​

这是栈顶储存的是call指令下一条指令的地址 然后ret指令跳到此地址

 

 

 

 这样整个函数栈帧的流程就结束了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值