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

函数创建和销毁

函数调用结束后是怎么返回? 那么通过学习函数创建和销毁,以上困惑就会迎刃而解。...注: 本次讲解使用是vs2013,不要使用太高级编译器,越高级编译器,越不容易学习和观察;同时,在不同编译器下,函数调用过程中栈创建是略有差异,具体细节取决于编译器实现。...为了讲清楚函数,我们需要先做一些铺垫: 寄存器: eax ebx ecx edx ebp esp ebp、esp这2个寄存器中存放是地址,这2个地址是用来维护函数...个dword(double word;一个word是两个字节)数据,全部改成CCCCCCCC mov dword ptr [ebp-8],0Ah mov dword ptr [ebp-14h],...总结: 局部变量在函数里被分配了一些空间进行创建 局部变量不初始化时候是随机值(比如上述过程中不初始化之前是cccccccc) 函数在调用之前就把参数从右向左进行压栈;真正进入函数后通过指针偏移量找到形参

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

函数创建和销毁

函数调用时,每个函数都会创建一个对应,并在函数返回时销毁它。了解函数创建和销毁机制,有助于我们更好地管理内存和理解程序执行过程。...提示:以下是本篇文章正文内容,下面案例可供参考 一、函数创建 函数创建是在函数调用时进行,栈中包含了局部变量、函数参数、返回地址和调用者上下文等信息。具体创建过程如下: 1....函数参数传递 在函数调用时,参数值会被压入栈中,这些参数会成为新栈一部分。在栈中,函数参数位置是从高地址到低地址分配。 2....函数调用 当上述过程完成后,函数调用就开始执行了。此时,新已经被创建并保存在栈中。 二、函数销毁 函数销毁是在函数返回时进行。...递归函数: 递归函数是一种特殊函数调用方式,它会导致多个同时存在于栈中。在设计递归函数时,需要确保递归终止条件正确,并且递归过程中栈大小和数量可控。否则就会导致栈溢出和性能问题。

8510

函数创建和销毁

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

81320

函数创建和销毁

---- 函数创建和销毁::   ebp,esp这两个寄存器中存放是地址,这两个地址是用来维护函数,edp被称为栈底指针,esp被称为栈顶指针。push:压栈:给栈顶放一个元素。...答:首先为此次函数调用创建函数,在函数找空间存放局部变量值。 2.为什么局部变量值是随机值? 随机值是系统开辟完函数后系统随机放进去。 3.函数是怎么传参?...形参是实参临时拷贝,值相同但空间不同,因此改变形参值不会影响实参值。 5.函数调用结束后怎么返回?...返回值并不会随着函数作用域销毁而销毁,而是放在eax中准备返回,当通过pop出栈回到main函数中再将返回值放到局部变量中。...#include 打印1-100之间所有3倍数数字 代码1 int main() { int i = 0; for (i = 1; i <= 100; i++) { if

52030

函数创建与销毁

2.栈简介 栈也叫过程活动记录,是编译器用来实现过程/函数调用一种数据结构。 函数每次调用,都有它自己独立。...栈中维持着函数调用所需要各种信息,包括函数入参、函数局部变量、函数执行完成后下一步要执行指令地址、寄存器信息等。...栈使用了栈这一数据结构,达到了后进先出(First In Last Out)内存管理原则。不管是插入数据还是删除数据,都是在栈顶进行。...二、函数介绍 每个函数被调用时都会建立栈,在接下来调试过程中我将会进一步解释。...3.函数创建与销毁(重点) 该程序汇编代码如下:(注释有每一步原理) --- d:\c语言\函数hszz\函数hszz\hszz.c -------------------------

49720

C语言函数详解

二、常用寄存器及简单汇编指令 ​ 寄存器 用途 EAX 累加寄存器:用于乘除法、函数返回值 EBX 用于存放内存数据指针 ECX 计数器 EDX 用于乘除法、IO指针 ESI 源索引寄存器,存放源字符串指针...引用百度百科:C语言中,每个栈对应着一个未运行完函数。栈中保存了该函数返回地址和局部变量。从这句话中,可以提炼以下几点信息: 栈是一块因函数运行而临时开辟空间。...每调用一次函数便会创建一个独立栈。 栈中存放函数必要信息,如局部变量、函数传参、返回值等。 当函数运行完毕栈将会销毁。 ​ 下面进入主题,图解函数创建与销毁过程。...在调试过程中将转到反汇编,便能直观看到main函数创建过程。首先需明确是,函数由寄存器esp,ebp维护。...进入Add()函数,可以看出这与此前main函数开辟栈过程类似,说明Add()函数调用又开辟了一块独立

2K20

函数创建和销毁

什么是函数? 理解了函数能解决什么样问题? 函数创建和销毁解析! 调试工具:vs 2013。 什么是函数?...这就需要用到了esp和ebp,它们分别指向了main函数两个位置,以便维护栈: (ebp和esp就算,调用了哪块函数,就去维护哪块函数,此时进入是main函数。) ...因为像是使用栈时候,往栈顶放数据,使用时,是从高地址开始望低地址开始使用。)...move,就是将0Ah,也就是10这个数据,放进【ebp-8】这个空间里面,这块空间也就是a地址。...同理,b和c变量跟a变量一样,存放在某块空间中,即为b或c地址。  到了Add函数:  首先是将b数据给了eax,然后push  eax,esp往上移。

73900

使用FILTER函数筛选满足多个条件数据

标签:Excel函数,FILTER函数 FILTER函数是一个动态数组函数,可以基于定义条件筛选一系列数据,其语法为: FILTER(数组,包括, [是否为空]) 其中,参数数组,是想要筛选数据,...参数包括,指定筛选条件,应返回TRUE,以便将其包含在查询中。参数是否为空,如果没有满足筛选条件结果,则可以给该参数指定要返回内容,可选。 我们可以使用FILTER函数返回满足多个条件数据。...假设我们要获取两个条件都满足时数据,如下图1所示示例数据,要返回白鹤公司销售香蕉数据。...图2 如果我们想要获取芒果和葡萄所有数据,则使用公式: =FILTER(A2:D11,(C2:C11="芒果")+(C2:C11="葡萄")) 将两个条件相加,表示两者满足之一即可。...例如,想要获取白鹤公司芒果和葡萄所有数据,则使用公式: =FILTER(A2:D11,((C2:C11="芒果")+(C2:C11="葡萄"))*(A2:A11="白鹤"))

1.2K20

数据学习整理

大家好,又见面了,我是你们朋友全栈君。 事先声明,本文档所有内容均在本人学习和理解上整理,不具有权威性,甚至不具有准确性,本人也会在以后学习中对不合理之处进行修改。...在了解数据之前,我们得先知道OSI参考模型 咱们从下往上数,数据在第二层数据链路层处理。我们知道,用户发送数据从应用层开始,从上往下逐层封装,到达数据链路层就被封装成数据。...FCS:循环冗余校验字段,用来对数据进行校验,如果校验结果不正确,则将数据丢弃。该字段长4字节。 IEEE802.3格式 Length:长度字段,定义Data字段大小。...SAP提供多个高层协议进程共用一个LLC层实体进行通信机制。...MAC地址   MAC地址是唯一标识一台设备序列号,和人身份证类似,具有唯一性和标识性。一个MAC地址由48个比特位,一般按16进制表示。一般主机发送数据有三种方式:单播、组播、广播。

2.6K20

CAN通信数据和远程「建议收藏」

(3)远程发送特定CAN ID,然后对应IDCAN节点收到远程之后,自动返回一个数据。...环回模式下(方便调试用),设置为发送远程: STM32端通过J-Link RTT调试软件可以打印出CAN接收到数据(在中断服务函数里面接收); 而通过CANTest软件不能接收到STM32端发送出来数据...,因为远程数据少了数据场; 正常模式下:通过CANTest软件手动发送一组数据,STM32端通过J-Link RTT调试软件也可以打印出CAN接收到数据; 附上正常模式下,发送数据显示效果...A可以用B节点ID,发送一个Remote frame(远程),B收到A ID Remote Frame 之后就发送数据给A!发送数据就是数据!...为了总线访问安全,每个发送器必须用独属于自己ID号往外发送(多个接收器过滤器ID可以重复),(可以让某种信号只使用特定ID号,而每个设备都是某一种信号检测源,这样就形成某一特定个设备都只是用特定

5.2K30

函数创建和销毁介绍

画横线这两个寄存器存放是地址。这两个地址是用来维护函数。 每一次函数调用,都要在栈区创立一个空间。 什么是栈? 函数通过栈来实现控制转移、参数传递、局部变量分配和释放3个功能。...计算机有专门一块内存区域作为栈,每个函数都可以在栈上申请一块内存区域作为函数存储空间,而该存储空间则被称为函数。...栈被定义为一种特殊容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈数据后出栈。...编写代码 详细解释栈创立和销毁过程 如下图所示,在栈区(计算机专门内存空间),每个函数在栈区申请一块内存空间,称为函数。在调用哪个函数,esp和ebp就跑去维护哪个函数。...首先为函数分配好栈空间,栈空间初始化好一部分空间之后,然后给局部变量在栈里分配一点空间。 为什么局部变量不初始化内容是随机? 随机值是被随机放入。如果初始化,就相当于把随机值覆盖了。

10210

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

函数函数调用过程中重要数据结构,它存储了函数局部变量、参数以及返回地址等信息。在函数调用过程中,函数创建和销毁是由编译器根据函数代码生成汇编指令来完成。...本文将详细介绍函数创建和销毁过程,并指出其中关键细节,同时提供相应优化方法。 以下是一些与函数相关重要概念和特性: 1....栈指针(SP):栈是一种后进先出(LIFO)数据结构,在函数调用期间使用栈在内存中通常是由相邻内存单元组成。(SP)是指向当前栈顶内存地址,通常在程序运行时自动维护。...它在函数执行期间被使用来管理局部变量、函数参数、内部临时数据等。当函数调用另一个函数时,调用者会将一些数据(如函数参数)压入堆栈中,ESP寄存器会随之向下移动,指向新堆栈顶部。...7.LEA(Load Effective Address):LEA指令目的是将计算出有效地址存储在寄存器中,以便稍后可以使用该地址来访问内存中数据

13910

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

寄存器 相关汇编指令: 函数调用堆栈 函数创建 分析栈创建: 为什么会出现“烫烫烫”: 分析main函数核心代码: 分析Add函数传参 函数调用过程 函数销毁下 结语✍ --...在经典计算机科学中,栈被定义为一种特殊容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈数据后出 栈(First...就像叠成一叠书,先叠上去书在最下面,因此要最后才能取出。 在计算机系统中,栈则是一个具有以上属性动态内存区域。程序可以将数据压入栈中,也可以将数据 从栈顶弹出。...寄存器无法永久性地存储数据(属于易失性存储器),它主要工作是暂时存储当前 CPU 正在处理指令以及 CPU 将要使用数据或者指令。...函数开辟,就是main函数空间,这一段空间中将存储main函数局部变量,临时数据已经调试信息等。

54210

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

二、理解函数能解决什么问题呢? 只要理解了函数创建和销毁,以下问题就能够很好理解了: 1、局部变量是如何创建? 2、为什么局部变量不初始化内容是随机?...在经典计算机科学中,栈被定义为一种特殊容器,用户可以将数据压入栈中(入栈 push),也可以将已经压入栈中数据弹出(出栈 pop),但是栈这个容器必须遵守一条规则:先入栈数据后出栈(First...就像叠成一叠书,先叠上去书在最下面,因此要最后才能取出。在计算机系统中,栈则是一个具有以上属性动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。...相关汇编命令 mov:数据转移指令 push:数据入栈,同时esp栈顶寄存器也要发生改变 pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变 sub:减法命令 add:加法命令 call:函数调用...,esp指向main函数栈顶,ebp指向了main函数栈底。

8210

C语言 深度探究具有不定参数函数

C语言 深度探究具有不定参数函数 ✨博主介绍 前言 C语言 stdarg.h 示例 ta原理 函数传参数本质 _INTSIZEOF(n) 其他宏 练习 实现printf 点击直接资料领取 ✨博主介绍...,但是C语言却支持不定参数函数,这里我深究一下里面的原理,并且学会它使用,自己简单实现一个简单printf函数。...4、补充:stdarg.h 并没有提供帮我们判断不定参数有多个方法,这里我是用 传入一个args_num来标记有多个不定参数,不要以为我们必须传入一个int来标记,我们可以采取其他方法(后面补充)。...现在我们研究一下,多个参数压栈顺序,是从左到右还是反之?...练习 实现printf 这里我们仅仅只是练习多个参数传递 而不是深入底层地实现printf这个函数,如果你愿意可以去看看 vprintf实现,有非常多奥秘值得探究。

47720

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

函数创建和销毁在所有编译器中都是大同小异,不同编译器会有不同方式,但是了解到了简单底层这些方法后,其他编译器都是在此基础上修饰,不必深究。...1、寄存器 ebp,esp 这两个寄存器中存放是地址,用来维护函数 2、编译器选择 最好使用visual 6.0来观察,它更加简洁,我们用到是vs2013,因为越早编译器观察到过程越不复杂...,一般是由高地址向低地址使用,main函数使用也要开辟栈 esp存入函数低位置地址,叫做栈顶指针,ebp存入函数高位置地址,叫做栈底指针。...第三条指令sub是减法,就是让esp-0E4h,改变栈顶地址,esp指向了上边某一区域(这里不会越出界限) 紫色即main函数 然后把ebx,esi,edi 三个push上去 lea...到现在,我把函数创建和销毁过程大致梳理了一遍,我在学完之后有一种恍然大悟感觉,希望这篇能够帮到大家。

7910
领券