首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

函数栈帧创建销毁

什么是函数栈帧? 理解了函数栈帧能解决什么样问题? 函数栈帧创建销毁解析! 调试工具:vs 2013。 什么是函数栈帧?...根据上面所述,调用main函数之前,esp和ebp指向是__tmainCRTStartup这个函数栈帧,也维护着这个栈帧。  ...因此:  ①局部变量是如何创建? 给函数创建栈帧,再在空间里面分配变量空间。 ②为什么局部变量不初始化内容是随机? 因为随机值是函数创建栈帧时,初始化成0XCCCCCCCCh时结果。...开辟空间上,只是值相同,但是地址不相同,形参是实参临时拷贝。 ⑤函数返回值是如何带回来调用函数之前,就把call指令下一条指令记住了,已经压栈了。...也就是说,是通过寄存器带回来! PS:本人对函数栈帧创建销毁拙见,请有大佬看到其中不妥问题时候,可以纠正我问题。谢谢!

72900

函数栈帧创建销毁

前言 最近在学习C语言过程遇到了一些问题,询问老师和查询相关资料基础上了解到了函数栈帧相关概念,对下列问题也有了答案。 局部变量是如何创建? 未初始化局部变量为什么是随机值?...(如果给一个变量未初始化,打印该变量内容就会出现一些没有实际意义文字或字母) 函数是如何调用?(过程是什么样?) 函数调用过程是如何传参? 形参和实参有什么联系和区别?...3.函数栈帧创建销毁(重点) 该程序汇编代码如下:(注释有每一步原理) --- d:\c语言\函数栈帧hszz\函数栈帧hszz\hszz.c -------------------------...0E4h位字节,这一步是为mian函数栈区预创建空间 00E91419 push ebx //把ebx压入栈 00E9141A push esi //把esi压入栈...main __tmainCRTStartup __mainCRTSartup 总结 以上就是今天要讲内容,本文用一个范例介绍了函数栈帧创建销毁,文章开头所提出问题也文章正文中做出了解答。

49220
您找到你想要的搜索结果了吗?
是的
没有找到

函数栈帧创建销毁

在前期学习,我们可能会有很多困惑: 局部变量是怎么创建? 为什么局部变量值是随机值? 函数是怎么传参?传参顺序是怎样? 形参和实参是什么关系? 函数调用是怎么做?...函数调用结束后是怎么返回? 那么通过学习函数栈帧创建销毁,以上困惑就会迎刃而解。...注: 本次讲解使用是vs2013,不要使用太高级编译器,越高级编译器,越不容易学习和观察;同时,不同编译器下,函数调用过程栈帧创建是略有差异,具体细节取决于编译器实现。...每一个函数调用,都要在栈区创建一个空间 接下来,就正式开始介绍函数栈帧创建销毁 push ebp mov ebp,esp sub esp,0E4h push ebx push esi push...总结: 局部变量函数栈帧里被分配了一些空间进行创建 局部变量不初始化时候是随机值(比如上述过程不初始化之前是cccccccc) 函数调用之前就把参数从右向左进行压栈;真正进入函数后通过指针偏移量找到形参

14510

函数栈帧创建销毁

函数参数传递 函数调用时,参数值会被压入栈,这些参数会成为栈帧一部分。栈帧函数参数位置是从高地址到低地址分配。 2....函数调用 当上述过程完成后,函数调用就开始执行了。此时,栈帧已经被创建并保存在栈。 二、函数栈帧销毁 函数栈帧销毁函数返回时进行。...这样,程序就会从函数调用处继续执行。 2. 销毁局部变量 函数返回之前,需要将栈帧局部变量值恢复到原来状态,并释放它们所占用内存。...当栈指针恢复到上一个栈帧位置时,程序会从该处继续执行,直到遇到下一个函数调用。 三、函数栈帧创建销毁过程注意事项 函数栈帧创建销毁过程,有一些注意事项需要我们注意。...函数返回之前,需要将返回值从栈帧取出并传递给调用函数函数调用过程,确保返回值存储和传递方式正确,避免返回值栈帧销毁之后变得不可访问。 4.

8210

函数栈帧创建销毁

---- 函数栈帧创建销毁::   ebp,esp这两个寄存器存放是地址,这两个地址是用来维护函数栈帧,edp被称为栈底指针,esp被称为栈顶指针。push:压栈:给栈顶放一个元素。...ds:[00C29114] add esp,8 cmp esi,esp cabl 00C2133B return 0; } 解决问题: 1.局部变量是怎么创建...答:首先为此次函数调用创建函数栈帧,函数栈帧找空间存放局部变量值。 2.为什么局部变量值是随机值? 随机值是系统开辟完函数栈帧后系统随机放进去。 3.函数是怎么传参?...形参刚开始调用之前就已经传过去了,形式参数从左向右传递。 4.形参和实参是什么关系? 形参是实参临时拷贝,值相同但空间不同,因此改变形参值不会影响实参值。 5.函数调用结束后怎么返回?...返回值并不会随着函数作用域销毁销毁,而是放在eax准备返回,当通过pop出栈回到main函数再将返回值放到局部变量

51130

函数栈帧创建销毁

---- 1.什么是函数栈帧 函数栈帧( stack frame )就是函数调用过程程序调用栈( call stack )所开辟空间,这些空间是用来存放: 函数参数和函数返回值...3.函数栈帧创建销毁解析 3.1栈 栈( stack )是现代计算机程序里最为重要概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到所有的计算机语言。...就像叠成一叠术,先叠上去最下面,因此要最后才能取出。 计算机系统,栈则是一个具有以上属性动态内存区域。程序可以将数据压入栈,也可以将数据 从栈顶弹出。...转入目标函数 jump :通过修改 eip ,转入目标函数,进行调用 ret :恢复返回地址,压入 eip ,类似 pop eip 命令 3.3解析函数栈帧创建销毁 3.3.1...2.这块空间维护是使用了两个寄存器:esp ebp,ebp记录是栈底地址,esp记录是栈顶地址。 3.函数栈帧创建销毁过程,不同编译器上实现方法大同小异。

80120

函数栈帧创建销毁介绍

编写代码 详细解释栈帧创立和销毁过程 如下图所示,栈区(计算机专门内存空间),每个函数栈区申请一块内存空间,称为函数栈帧。调用哪个函数,esp和ebp就跑去维护哪个函数栈帧。...是因为main函数调用时,栈区开辟空间其中每一 个字节都被初始化为0xCC,而arr数组是一个未初始化数组,恰好在这块空间上创建,0xCCCC(两 个连续排列0xCC)汉字编码就是“烫”,...接着执行语句让ebp-8放入了一个10。(与上一个数值之间差了两个整型) 接着调用add函数, 接着栈顶压20。 mov 把ebp-14h放到eax里。...再把算出结果30放到ebp-8里面去。我们可以发现参数是从右向左传。形参不是add函数内部创建,而是找到刚刚传参压过去空间。a和b就会分别被认为是x和y。...函数返回值是如何带会? 调用之前就把call指令下一条指令地址记住了,当往回返时候,就可以跳转到call指令下一条指令地址,返回值是通过寄存器方式调用回来。 欢迎交流!

9510

初识函数栈帧创建销毁(笔记)

函数栈帧是函数调用过程重要数据结构,它存储了函数局部变量、参数以及返回地址等信息。函数调用过程函数栈帧创建销毁是由编译器根据函数代码生成汇编指令来完成。...本文将详细介绍函数栈帧创建销毁过程,并指出其中关键细节,同时提供相应优化方法。 以下是一些与函数栈帧相关重要概念和特性: 1....它在函数执行期间被使用来管理局部变量、函数参数、内部临时数据等。当函数调用另一个函数时,调用者会将一些数据(如函数参数)压入堆栈,ESP寄存器会随之向下移动,指向堆栈顶部。...当调用函数时,调用之前,用push把参数从右向左压栈, 当进入形参函数时,函数栈桢里通过指针偏移量找到形参 4.形参和实参是什么关系?..., main函数里用到指针指向空间,函数结束后仍然销毁 只要函数调用完了就销毁这些空间 如果在函数内部创建了静态变量,就不会销毁

12210

【说站】python实例创建销毁函数整理

python实例创建销毁函数整理 说明 1、_new_在对象实例化之前调用,new()方法将返回cls(cls代表当前类别)实例,然后这种__init__()方法将作为结构方法接收此实例。...2、_init_是对象初始化函数。 3、_del_垃圾回收对象销毁调用。...实例 class Sample:     def __new__(cls, *args, **kwargs):         print("对象创建之前调用new方法")         instance...)         return instance       def __init__(self, name):         self.name = name         print("对象创建咯...") my_list = [] my_list.append(sample) del my_list[0]  # 删除引用,垃圾回收 以上就是python实例创建销毁函数整理,希望对大家有所帮助。

65430

【C语言】函数——栈帧创建销毁

寄存器 相关汇编指令: 函数调用堆栈 函数栈帧创建 分析栈帧创建: 为什么会出现“烫烫烫”: 分析main函数核心代码: 分析Add函数传参 函数调用过程 函数栈帧销毁下 结语✍ --...注意:函数栈帧创建销毁过程,不同编译器上实现方法大同小异。本篇博客基于VS2019编译器 我们可以看到, main 函数调用之前,是由 invoke_main 函数来调用main函数。...函数创建栈帧方法和在main函数是相似的,栈帧空间大小上略有差异而已。...将main函数 ebp 压栈 计算 ebp 和 esp 将 ebx , esi , edi 寄存器值保存 计算求和,计算求和时候,我们是通过 ebp 地址进行偏移访问到了函数调用前压栈进去...函数栈帧销毁下 00BE177F pop edi //栈顶弹出一个值,存放到edi,esp+4 00BE1780 pop esi //栈顶弹出一个值,存放到esi,esp+4 00BE1781

53110

你知道函数栈帧创建销毁吗?

栈是一种简单数据结构,之前函数时候我们一直使用它,却没有意识到!...一、概述 函数栈帧是在内存栈区为被调函数开辟一块空间,里面用来存放该函数定义变量等东西,当函数运行完毕栈帧将被销毁。...a,即b指向a sub a num a值减去num,即a向低地址移动 lea(load effective adress) 加载有效地址(示例理解) 四、函数栈帧创建 所有函数调用都会在内存里面的栈区创建函数栈帧...,0CCCCCCCCh、rep stos dword ptr es:[edi] main函数变量创建 4.2 main函数调用Add函数 int a = 10; mov dword...Add函数变量Z创建 此过程和main函数变量a,b,c创建过程是一样 z=x+y int z = x + y; mov eax,dword ptr [ebp+8] //

10910

C语言——F函数栈帧创建销毁

二、理解函数栈帧能解决什么问题呢? 只要理解了函数栈帧创建销毁,以下问题就能够很好理解了: 1、局部变量是如何创建? 2、为什么局部变量不初始化内容是随机?...2、这块空间维护是使用了2个寄存器: esp 和 ebp , ebp 记录是栈底地址, esp 记录是栈顶地址。 3、函数栈帧创建销毁过程,不同编译器上实现方法大同小异。...Add函数创建栈帧方法和在main函数是相似的,栈帧空间大小上略有差异而已。 1. 将main函数 ebp 压栈; 2. 计算 ebp 和 esp; 3....将求出和放在 eax 寄存器准备带回。 3.5、函数栈帧销毁函数调用要结束返回时候,前面创建函数栈帧也开始销毁。 那具体是怎么销毁呢?我们看一下反汇编代码。...1、局部变量是如何创建? 答:一个函数帧栈被创建,并将局部变量推入到函数栈帧空间,然后为其分配内存空间。 2、为什么局部变量不初始化内容是随机

7910

VC 调用main函数之前操作

---- title: VC 调用main函数之前操作 tags: [VC++, 反汇编, C++实现原理] date: 2018-09-16 10:36:23 categories: VC+...而这个链表头指针被存到fs寄存器 知道了这点之后再来看这段代码,首先将异常函数入栈,然后将之前链表头指针入栈,这样就组成了一个EXCEPTION_REGISTRATION_RECORD结构节点而这个节点指针现在就是...通过这样几句代码就向主线程中注入了一个异常处理函数。...只是我们代码不使用这些变量罢了。 到此,这篇博文简单介绍了下在调用main函数之前执行相关操作,这些汇编代码其实很容易理解,只是注册异常代码有点难懂。...,未调用这个函数之前是不能进行printf 调用 GetCommandLineA函数获取命令行参数 调用 GetEnvironmentStringsA 函数获取环境变量 调用main函数 ---

2.1K20

函数栈帧创建销毁【详细图解与解释】

注:本文章所使用编译器是VS2010,由于不同编译器函数栈帧与销毁略有差异,所以具体细节请读者自行实践!...所以,我们分配空间时,要为__tmainCRTStartup函数以及mainCRTStartup函数分配一块空间。...接下来开始通过反汇编来观察栈帧空间分配: 通过我们之前了解,开辟main之前先开辟了__tmainCRTStartup,所以我们来为其分配空间: 先来看前三步,分别是push:压栈和...效果如下: 接下来push三次 接下来四步:lea这步操作就是让[ebp-0E4h]这个值放入edi内,然后通过观察我们可以发现,此时放入值后edi所指向就是对应在进行push...接下来程序运行完后就是main函数销毁,与之前Add函数销毁步骤大致相同,就不再赘述了。 关于栈帧创建销毁问答题

33820

C语言:底层剖析——函数栈帧创建销毁

三、函数栈帧创建销毁 3.1 什么是栈?...3.5.5.6Add函数栈帧销毁 此图为Add函数栈帧销毁 pop         edi     栈顶弹出一个值,存放到edi,esp+4 pop         esi     栈顶弹出一个值...因为main函数执行过程,main函数是执行到一半时候调用了Add函数调用(call指令)之前记录执行到一半那个地址,方便Add函数结束之后,能够及时返回到自己main函数栈帧之前地方...,同时形参创建也是函数调用之前实现,所以回到该地址还同时可以弹出保存形参值栈。...对形参进行及时销毁。 五、对 二 问题进行解释       通过对函数栈帧创建销毁学习后,对于这个函数底层知识有了更深刻理解。以此们可以解决目录二提到问题。

21810

C语言内功修炼--函数栈帧创建销毁

目录 什么是栈帧 什么是栈 栈帧创建销毁 main函数调用过程  Add函数调用过程 ---- 什么是栈帧 简单地说 程序执行过程可看作连续函数调用,而C语言中,每个栈帧对应着一个未运行完函数...从逻辑来看 栈帧就是一个函数执行环境:函数参数、函数局部变量、函数执行完后返回到哪里等 ---- 什么是栈 详解之前我们还得明白一点栈: 栈,也叫堆栈,是一种数据结构,具有先进后出特点...(类似子弹上弹夹) 函数栈帧创建过程,内存从高地址往低地址使用 寄存器edp存放了指向函数栈帧栈底地址(高地址) 寄存器esp存放了指向函数栈帧栈顶地址(低地址) esp和ebp...共同维护函数栈帧 ---- 栈帧创建销毁 VS2013下逐步调试add函数向大家展示并讲解栈帧创建销毁过程 int Add(int x, int y) { int z = 0;...,但因为内存分配使得他们地址并不连贯,所以为了程序执行流畅,这里需要声明被调用函数执行完成后返回上一级函数地址)执行call指令同时,栈顶ecx又开辟了一开空间,用于存放call指令下一条指令地址

52020

抽丝剥茧C语言(阶)函数栈帧创建销毁——图解

函数栈帧创建销毁 导语 问题 寄存器 函数栈帧 函数栈帧是什么? 内存分布 什么是栈?...详细讲解函数栈帧 栈帧维护 开辟main函数 创建局部变量与初始化 调用Add函数 Add函数内部 返回与销毁 结束 导语 这篇文章是从头贯穿到尾,让你更加详细了解函数是什么样在内存里创建,怎么样销毁...然后看下一行指令call,这是准备调用Add函数,这是到了call这一行时,按F11进入这个函数内部,进入内部之前我们发现这么一个问题: 红色是变化一行,这里存入地址是不是很眼熟?...其实是这样,看最后一行,我们把[ebp-8]这个地址值暂时存在了eax这个寄存器里,虽然变量Z销毁了,但是寄存器eax是不会销毁,它是集成CUP硬件,所以说寄存器带着Z值就走了。...剩下main函数销毁之前add销毁一样。 结束 到这里函数栈帧与销毁就讲完了,我相信大家对于上面的疑惑都有了答案。

48800

【内功修炼】深入理解函数栈帧创建销毁

那接下来,我们就来一起学习一下函数栈帧创建销毁过程… 3. 函数栈帧创建销毁解析 3.1 什么是栈?...那EBP 和 ESP 我们这里要给大家介绍一下: ebp 和 esp这两个寄存器函数栈帧创建销毁起着比较关键作用。...函数栈帧创建销毁过程,不同编译器上实现方法大同小异,本次演示以VS2022(Debug下X_86环境)为例。...invoke_main 是一个 Microsoft C/C++ 运行时库函数,用于调用程序函数(main函数) 不过 invoke_main 函数之前函数调用我们就暂时不考虑了 但是我们可以确定...总结一下: sub会让esp地址减去一个16进制数字0xe4,产生esp,此时新esp就是main函数栈帧esp,此时结合上一条指令ebp和当前esp,ebp和esp之间维护了一块栈空间

12111

【C语言加油站】函数栈帧创建销毁

导言 本篇内容为函数补充知识点——函数栈帧创建销毁本篇内容,我们将会学习函数篇章未提到一些知识点: 局部变量是如何创建?...接收数码:接收脉冲作用下,将外输入数码存入寄存器。 存储数码:没有写入脉冲来之前,寄存器能保存原有数码不变。 输出数码:输出脉冲作用下,才通过电路输出数码。...接下来就是要回到main函数了; 八、函数栈帧销毁 回到main函数之前,程序执行了如下操作: 00C417B5 pop edi 00C417B6 pop esi...调用Add函数之前,先通过call指令将下一条指令地址存放在一个空间中,这是为了调用结束后能够通过ret正确返回而进行一步操作; 创建Add函数之前,通过push指令将main函数栈底地址存放在空间中...那到目前为止,函数栈帧创建销毁过程我就全部介绍完了,后面还有涉及到printf函数调用与main函数函数栈帧销毁我就不过多叙述了。如果各位还有何疑问的话可以评论区留言哦!

47030

程序员内功心法之函数栈帧创建销毁

想要对上面的这六个问题做出准确深入回答,我们需要学习函数栈帧创建销毁相关知识,正式进入函数栈帧之前,我们需要了解一些相关寄存器和汇编指令。...---- 6、函数栈帧创建销毁 我们以一段程序为例讲解函数栈帧:(注意: 函数栈帧创建销毁过程,不同编译器上实现方法和细节会有所差异,一般来说,越编译器对函数栈帧封装就越严密,本次演示以...Add函数创建栈帧方法和在main函数是相似的,栈帧空间大小上略有差异而已。 1. 将main函数 ebp 压栈。 2. 计算 ebp 和 esp。 3....程序是函数调用返回之后,eax中去读取返回值。 ---- 7、对开篇问题解答 当我们完整了解了函数栈帧创建销毁过程后,我们就可以回答开篇提到问题了: 局部变量是如何创建?...我们调用目标函数之前,就会在本函数栈顶上从右向左依次压入需要传递参数,然后再创建好被调函数栈帧后通过栈底寄存器偏移量来访问形参,所以被调函数形参不是在被调函数栈帧空间中创建,而是调用函数栈帧创建

41300
领券