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

函数栈帧的创建和销毁

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

55130

函数栈帧的创建和销毁

---- 1.什么是函数栈帧 函数栈帧( stack frame )就是函数调用过程中在程序的调用栈( call stack )所开辟的空间,这些空间是用来存放: 函数参数和函数返回值...3.函数栈帧的创建和销毁解析 3.1栈 栈( stack )是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。...3.2认识相关寄存器和汇编指令 相关寄存器 eax :通用寄存器,保留临时数据,常用于返回值 ebx :通用寄存器,保留临时数据 ebp :栈底寄存器 esp :栈顶寄存器...转入目标函数 jump :通过修改 eip ,转入目标函数,进行调用 ret :恢复返回地址,压入 eip ,类似 pop eip 命令 3.3解析函数栈帧的创建和销毁 3.3.1...2.这块空间的维护是使用了两个寄存器:esp ebp,ebp记录的是栈底的地址,esp记录的是栈顶的地址。 3.函数栈帧的创建和销毁过程,在不同的编译器上实现的方法大同小异。

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

    函数栈帧的创建和销毁

    在函数调用时,每个函数都会创建一个对应的栈帧,并在函数返回时销毁它。了解函数栈帧的创建和销毁机制,有助于我们更好地管理内存和理解程序执行的过程。...提示:以下是本篇文章正文内容,下面案例可供参考 一、函数栈帧的创建 函数栈帧的创建是在函数调用时进行的,栈帧中包含了局部变量、函数参数、返回地址和调用者的上下文等信息。具体的创建过程如下: 1....存储返回地址 函数调用的过程中,调用语句的后面会有一个返回地址(Return Address)标记,用于指示函数执行结束后返回的位置。通常情况下,返回地址是存储在栈帧中的。 3....函数调用 当上述过程完成后,函数调用就开始执行了。此时,新的栈帧已经被创建并保存在栈中。 二、函数栈帧的销毁 函数栈帧的销毁是在函数返回时进行的。...当栈指针恢复到上一个栈帧的位置时,程序会从该处继续执行,直到遇到下一个函数调用。 三、函数栈帧的创建和销毁过程中的注意事项 在函数栈帧的创建和销毁过程中,有一些注意事项需要我们注意。

    12910

    函数栈帧的创建和销毁

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

    18010

    函数栈帧的创建与销毁

    前言 最近在学习C语言的过程中遇到了一些问题,在询问老师和查询相关资料的基础上了解到了函数栈帧的相关概念,对下列问题也有了答案。 局部变量是如何创建的? 未初始化的局部变量为什么是随机值?...2.栈帧简介 栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。 函数的每次调用,都有它自己独立的栈帧。...栈帧使用了栈这一数据结构,达到了后进先出(First In Last Out)的内存管理原则。不管是插入数据还是删除数据,都是在栈顶进行的。...(本次的代码调试我使用的环境是VS2013版,其他版本可能会有细微差别,但大体步骤和内容是类似的) 1.源代码 为了演示这次函数栈帧的创建与销毁,我们将以一次简单的程序来作为范例。...3.函数栈帧的创建与销毁(重点) 该程序的汇编代码如下:(注释有每一步的原理) --- d:\c语言\函数栈帧hszz\函数栈帧hszz\hszz.c -------------------------

    53320

    函数栈帧的创建和销毁

    相信在学习的过程中,你对上面的问题或多或少都会有些困惑,今天的博客--函数栈帧的创建和销毁就可以帮助你解决这些困惑; 这些都是和函数的栈帧的创建和销毁有关,这个函数栈帧在不同版本的编译器有关,略有差异但是大致相同...再使用低地址;我们的main函数开始执行之后,就会开辟main函数的函数栈帧,ebp esp分别指向的就是main函数的函数栈帧的边界(如图所示);我们可以把这个函数栈帧创建的过程理解为一个盖房子的过程...; 我们对于栈这个空间,我们需要了解的预备知识就是压栈和出栈这两个专业术语: push压栈:就是在栈的顶部放上数据; pop出栈:就是从栈的顶部删除数据; (1)上面的反汇编语言的第一句就是push...)return z指令的后面的ebp-8实际上就是我们的计算结果30,我们把这个数据存到eax这个寄存器里面,这个寄存器是不会随着add函数栈帧的销毁而消失的; (2)返回之后的指令是,pop就是我们前面已经铺垫的出栈的操作...是在栈帧里面创建之后压栈上去的,所以形参是实参的临时拷贝,形参的修改不会影响实参(因为我们的add函数使用的是压栈的xy并不是我们最开始创建的xy); (3)我们的函数调用完成之后,会找到栈顶存放的call

    4000

    函数栈帧的创建和销毁

    什么是函数栈帧? 理解了函数栈帧能解决什么样的问题? 函数栈帧的创建和销毁解析! 调试工具:vs 2013。 什么是函数栈帧?...也就是Add函数的地址  这个时候,就能进入到Add函数里面去了!进入了Add函数,指令的指向顺序跟进入main函数的一样,就是要给Add函数创建栈帧!  ...紧接着,把eax的值放到ebp-20h中去,也就是c的地址 最后,打印,然后结束程序,销毁main函数的栈帧。 因此:  ①局部变量是如何创建的? 给函数创建栈帧,再在空间里面分配变量的空间。...②为什么局部变量不初始化内容是随机的? 因为随机值是在函数在创建栈帧时,初始化成0XCCCCCCCCh时的结果。 ③函数调用时参数是如何传递的?传参的顺序是怎么样的?...也就是说,是通过寄存器带回来的! PS:本人对函数栈帧的创建和销毁的拙见,请有大佬看到的其中不妥的问题时候,可以纠正我的问题。谢谢!

    78100

    函数栈帧的创建和销毁介绍

    栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈。...编写代码 详细解释栈帧创立和销毁过程 如下图所示,在栈区(计算机专门的内存空间),每个函数在栈区申请一块内存空间,称为函数栈帧。在调用哪个函数,esp和ebp就跑去维护哪个函数的栈帧。...是因为main函数调用时,在栈区开辟的空间的其中每一 个字节都被初始化为0xCC,而arr数组是一个未初始化的数组,恰好在这块空间上创建的,0xCCCC(两 个连续排列的0xCC)的汉字编码就是“烫”,...再把算出的结果30放到ebp-8里面去。我们可以发现参数是从右向左传的。形参不是在add函数内部创建的,而是找到刚刚传参压过去的空间。a和b就会分别被认为是x和y。...再把eax的值放到ebp-20h当中。eax的值就是出add函数时委托到eax当中的和,和放到局部变量c当中,这样返回值就带回来了。 解决疑惑 局部变量是如何创建的?

    13210

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

    函数栈帧是函数调用过程中重要的数据结构,它存储了函数的局部变量、参数以及返回地址等信息。在函数调用过程中,函数栈帧的创建和销毁是由编译器根据函数代码生成的汇编指令来完成的。...本文将详细介绍函数栈帧的创建和销毁过程,并指出其中的关键细节,同时提供相应的优化方法。 以下是一些与函数栈帧相关的重要概念和特性: 1....在函数调用期间,编译器会根据需要调整栈指针,以确保函数栈帧的内存安排正确。 2. 基址指针(EBP):用于在堆栈框架中建立一个稳定的参考基准。它通常用于访问局部变量和函数参数。...它在函数执行期间被使用来管理局部变量、函数参数、内部临时数据等。当函数调用另一个函数时,调用者会将一些数据(如函数参数)压入堆栈中,ESP寄存器会随之向下移动,指向新的堆栈顶部。...当函数被调用时,编译器会在栈上动态创建函数栈帧,并在其中分配存储局部变量和参数的空间。

    21510

    函数栈帧的创建和销毁(详细理解)

    问题: 1.局部变量是怎么创建的? 调用函数的时候,会为函数开辟一块空间,然后第一个局部变量从栈低分配一块空间给局部变量。 2.为什么局部变量的值是随机的?...因为在为函数开辟空间的时候,这块空间的里的内存都被初始化为一个值,不同编译器中值可能不同。如果只是创建局部变量,没有初始化覆盖里面的值,那此时局部变量里的值就是为函数内存初始化的值。...当进入Add函数,去运行Add函数的时候,esp和ebp就去维护Add函数的函数栈帧,并且把mian函数的esp和ebp的指针保存下来,等Add函数结束以后,esp和ebp就又可以去维护main函数的函数栈帧...所以上面的图中比main高地址处还有这两个函数的函数栈帧,这两个函数的函数栈帧比main函数的函数栈帧高。...3.函数栈帧创建的过程 在调用main函数时,已经存在来到下面情形,__tmainCRTStartup()调用main函数 1.push ebp:在栈顶,在栈顶把ebp指针的值放进去。

    9110

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

    寄存器 相关的汇编指令: 函数的调用堆栈 函数栈帧的创建 分析栈帧的创建: 为什么会出现“烫烫烫”: 分析main函数中的核心代码: 分析Add函数的传参 函数调用过程 函数栈帧的销毁下 结语✍ --...相关寄存器介绍 eax:通用寄存器,保留临时数据,常用于返回值 ebx:通用寄存器,保留临时数据 ebp:栈底寄存器 esp:栈顶寄存器 eip:指令寄存器,保存当前指令的下一条指令的地址...那接下来我们从main函数的栈帧创建开始说起: 函数栈帧的创建 调试到main函数开始执行的第一行,右击鼠标转到反汇编。...函数开辟的,就是main函数的栈帧空间,这一段空间中将存储main函数中的局部变量,临时数据已经调试信息等。...其实是局部变量的创建时在局部变量所在函数的栈帧空间中创建的 //调用Add函数 ret = Add(a, b); //调用Add函数时的传参 //其实传参就是把参数push到栈帧空间中 00BE1850

    62510

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

    这种数据结构称为栈。栈是一种简单的数据结构,之前学函数的时候我们一直在使用它,却没有意识到!...一、概述 函数栈帧是在内存中的栈区为被调函数开辟的一块空间,里面用来存放该函数中定义的变量等东西,当函数运行完毕栈帧将被销毁。...edx "数据寄存器’,在进行乘、除法运算时,可作为默认的操作数参数参与运算 esp 栈指针寄存器,存放函数栈顶地址 ebp 帧指针寄存器,存放函数栈底地址 esp和ebp这两个寄存器中存放的是地址...a,即b指向a sub a num a的值减去num,即a向低地址移动 lea(load effective adress) 加载有效地址(在示例中理解) 四、函数栈帧的创建 所有函数的调用都会在内存里面的栈区创建函数栈帧...通过 __tmainCRTStartup 函数调用main函数,所以要创建好__tmainCRTStartup 的栈帧 push ebp push ebp就是把__mainCRTStartup 函数栈底的地址压栈

    14410

    【C语言底层】函数栈帧的创建和销毁

    函数栈帧的创建和销毁在所有编译器中都是大同小异的,不同的编译器会有不同的方式,但是了解到了简单的底层的这些方法后,其他的编译器都是在此基础上修饰,不必深究。...1、寄存器 ebp,esp 这两个寄存器中存放的是地址,用来维护函数栈帧 2、编译器的选择 最好使用visual 6.0来观察,它更加简洁,我们用到的是vs2013,因为越早的编译器观察到的过程越不复杂...,一般是由高地址向低地址使用,main函数的使用也要开辟栈帧 esp存入函数低位置的地址,叫做栈顶指针,ebp存入函数高位置的地址,叫做栈底指针。...0 了,它返回到了调用它的函数 __tmainCRTStartup()里面 当然在一开始的时候我们也会为这两个函数创建空间,在main函数之前 调用Add函数时再创建空间 汇编语言的指令...到现在,我把函数栈帧的创建和销毁的过程大致梳理了一遍,我在学完之后有一种恍然大悟的感觉,希望这篇能够帮到大家。

    10310

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

    二、理解函数栈帧能解决什么问题呢? 只要理解了函数栈帧的创建和销毁,以下问题就能够很好的理解了: 1、局部变量是如何创建的? 2、为什么局部变量不初始化内容是随机的?...2、认识相关寄存器和汇编指令 相关寄存器 eax:通用寄存器,保留临时数据,常用于返回值 ebx:通用寄存器,保留临时数据 ebp:栈底寄存器 esp:栈顶寄存器 eip:指令寄存器,保存当前指令的下一条指令的地址...//其实是局部变量的创建时在局部变量所在函数的栈帧空间中创建的 //调用Add函数 c = Add(a, b); //调用Add函数时的传参 //其实传参就是把参数push到栈帧空间中 00BE1850...,就要开始创建Add函数的栈帧空间了。...1、局部变量是如何创建的? 答:一个新的函数帧栈被创建,并将局部变量推入到函数栈帧空间,然后为其分配内存空间。 2、为什么局部变量不初始化内容是随机的?

    12910

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

    目录 什么是栈帧 什么是栈 栈帧的创建与销毁 main函数调用过程  Add函数的调用过程 ---- 什么是栈帧 简单地说 程序的执行过程可看作连续的函数调用,而C语言中,每个栈帧对应着一个未运行完的函数...每个函数的每次调用(通常使用堆栈实现),都有它自己独立的一个栈帧 这个栈帧中保存了该函数的返回地址和局部变量维持着所需要的各种信息 所以栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构...从逻辑来看 栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等 ---- 什么是栈 在详解之前我们还得明白一点栈: 栈,也叫堆栈,是一种数据结构,具有先进后出的特点...(类似子弹上弹夹) 在函数栈帧创建过程中,内存从高地址往低地址使用 寄存器edp存放了指向函数栈帧栈底的地址(高地址) 寄存器esp存放了指向函数栈帧栈顶的地址(低地址) esp和ebp...共同维护函数栈帧 ---- 栈帧的创建与销毁 在VS2013下逐步调试add函数向大家展示并讲解栈帧的创建和销毁过程 int Add(int x, int y) { int z = 0;

    54220

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

    注:本文章所使用的编译器是VS2010,由于不同编译器的函数栈帧与销毁略有差异,所以具体细节请读者自行实践!...常见寄存器 寄存器有:eax、ebx、ecx、edx、edi、esi、ebp、esp 其中 ebp 和 esp 是用来维护函数栈帧的,他们里面存放的是地址。 他们维护的是某个正在被调用的函数。...int a=0; int b=20; int c=0; c=Add(a,b); printf("%d\n",c); return 0; } 注:每一个函数调用都会在栈区创建一个空间...x,放到eax里,然后把ebp+12就是形参y与eax相加,最后把eax放到ebp-8也就是z的位置: 最后看这个: 首先ebp-8也就是z放到eax,这样子就防止销毁add后数据也没了...接下来程序运行完后就是main函数的销毁,与之前Add函数销毁步骤大致相同,就不再赘述了。 关于栈帧创建与销毁的问答题

    37120

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

    二、理解函数栈帧能解决什么问题呢?      函数栈帧的创建和销毁,是函数调用的底层逻辑,通过学习这方面的内容可以解决以下问题: 1、局部变量是如何创建的? 2、为什么局部变量不初始化内容是随机的?...三、函数栈帧的创建和销毁 3.1 什么是栈?...3.2 认识相关的寄存器和汇编指令 相关寄存器: eax:通用寄存器,保留临时数据,常用于返回值 ebx:通用寄存器,保留临时数据 ebp:栈底寄存器 esp:栈顶寄存器 eip:指令寄存器,保存当前指令的下一条指令的地址...3.3.5 函数栈帧的创建 3.3.5.1main函数栈帧的开辟 我们从main函数转换的反汇编代码进行演示,一行行拆解代码 这一块内容为main函数创建变量之前的代码,该代码的实现的就是main()函数的栈帧创建...3.5.5.4Add函数的栈帧开辟 此图为Add函数的栈帧开辟 在Add函数中创建栈帧的方法和在main函数中是相似的,在栈帧空间的大小上略有差异而已。 1. 将main函数的 ebp 压栈 2.

    59910

    【C语言】函数栈帧的创建和销毁(逐步分析)

    在不同的编译器下,函数调用的过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。...每一个函数调用都要在栈区穿件一个空间 寄存器 寄存器是 CPU 内部用来存放数据的一些小型 存储区域 ,用来暂时存放参与运算的数据和运算结果。...8),此时z空间的值是30,再将这个值放入eax寄存器中,这一步防止函数栈帧销毁时数据流失,所以将值保存在eax中。...,从而创建了局部变量 为什么局部变量的值是随机值 因为随机值是在我们创建函数栈帧时放进去的,函数空间里都是随机值,所以一定要初始化。...,再读取通过call指令存放下一个指令的地址,就直接返回主函数的栈帧里,返回值是通过寄存器存储,保护数据在调用的函数栈帧销毁时不丢失,再通过寄存器将值放入对应的主函数空间

    15110

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

    那接下来,我们就来一起学习一下函数栈帧的创建和销毁的过程… 3. 函数栈帧的创建和销毁解析 3.1 什么是栈?...3.2 认识相关寄存器和汇编指令 常见寄存器 首先我们来了解一个东西叫做——寄存器: 在计算机体系结构中,寄存器是一种高速存储器,用于保存指令执行过程中的数据和地址。...寄存器是与处理器紧密集成的组件,用于临时存储、操作和传递数据。 概念大家简单理解一下。...但不能用于直接从内存复制到内存 push:数据入栈,同时esp栈顶寄存器也要发生改变 pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变 sub:用于两个操作数相减,相减的结果保存到第一个操作数中...所以,先把z的值给一个寄存器保存起来,因为寄存器是存在于CPU内部的一组用于存储和处理数据的高速存储器,它是不会随着函数调用结束而销毁的。

    35321

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

    导言 本篇内容为函数的补充知识点——函数栈帧的创建和销毁。 在本篇内容中,我们将会学习在函数篇章中未提到的一些知识点: 局部变量是如何创建的?...注:今天我们研究的函数栈帧的创建与销毁就与BP和SP这两个寄存器密切相关。 寄存器SI和DI称为变址寄存器,通常与DS一起使用,为访问现行数据段提供段内地址偏移量。...二、函数栈帧的创建 函数栈帧的创建与维护是通过 bp 和 sp 这两个寄存器实现的,在汇编语言中,这两个寄存器被称为 ebp 和 esp 。...现在我们回到我们的代码: 现在代码运行到了int a = 2;这一行,也就是说前面的过程都是在对main函数的栈帧进行创建,创建好的main函数的栈帧情况如下所示: 现在main函数的栈帧也开辟好了,接下来就是要开始创建局部变量...,我们直接来到创建临时变量z这一行; 此时我们就完成了Add函数的函数栈帧的创建,接下来我们就要进行局部变量z的创建与函数形参的使用了; 七、形参与实参 这里我们来分析一下代码: int z = 0;

    60530
    领券