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

C语言函数的栈详解

二、常用寄存器及简单汇编指令 ​ 寄存器 用途 EAX 累加寄存器:用于乘除法、函数返回值 EBX 用于存放内存数据指针 ECX 计数器 EDX 用于乘除法、IO指针 ESI 源索引寄存器,存放源字符串指针...EDI 目标索引寄存器,存放目标字符串指针 ESP 存放栈顶指针 EBP 存放栈底指针 汇编指令 用途 mov mov A,B 将数据B移动到A push 压栈 pop 出栈 call 函数调用 add...引用百度百科:C语言中,每个栈对应着一个未运行完的函数。栈中保存了该函数的返回地址和局部变量。从这句话中,可以提炼以下几点信息: 栈是一块因函数运行而临时开辟的空间。...在函数栈、局部变量创建完毕后,进行Add()函数运算过程: PLAINTEXT c = a + b; 00AA13E5 mov eax,dword ptr [ebp+8] 00AA13E8...3.3.4 函数返回 PLAINTEXT return c; 00AA13EE mov eax,dword ptr [ebp-8] 将返回值传递至寄存器eax中,因此在函数调用结束函数栈被销毁时

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

    C语言函数调用及栈结构

    地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念,真正的代码及数据都存在物理内存中。...栈状态值:保存前栈的顶部和底部(实际上只保存前栈的底部,前栈的顶部可以通过栈平衡计算得到),用于在本栈被弹出后恢复出上一个栈。...然后继续执行下一条语句:mov ebp,esp即把esp的值赋给ebp,这样,ebp也就指向了现在esp的位置 然后sub esp 0C0h 这样就为main函数开辟了一段空间然后将ebx、esi、edi...如此一来,几乎所有的c函数都由如下两个指令开 始: push ebp mov ebp, esp 下一步,fun必须为它的局部变量分配空间,同时,也必须为它可能用到的一些临时变量分配 空间。...比如,foo中的一些C语句可能包括复杂的表达式,其子表达式的中间值就必须得有地方存放。

    1.6K30

    C语言实例_解析GPS源数据

    这些消息类型涵盖了定位、导航和时间相关的数据,可以用于实时定位、航行导航以及时间同步等应用。 NMEA 0183格式的数据通常由GPS接收器、导航仪、自动驾驶系统等设备产生,并通过串口输出。...其他设备可以通过读取串口数据,并按照NMEA 0183的规范解析数据。这样,不同设备之间就可以进行数据交换和共享,实现设备之间的互操作性。...三、C语言解析数据代码 3.1 解析每个字段数据 以下是使用C语言解析NMEA 0183数据字段并将其打印到串口: #include #include //...// 打印字段数据串口 printf("%s\n", str); } 3.2 解析定位数据 定义了一个名为GPSData的结构体,并将解析后的定位数据存储在该结构体的各个变量中: #include...使用printGPSData函数将数据打印到串口

    68120

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

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 目录 前言 什么是栈 什么是函数的栈 认识相关寄存器和汇编指令...下面我们要先来理解一些概念 什么是栈 在学习C语言中,我们关注内存中的3个区域,栈区、堆区和静态区 那究竟什么是栈呢?...⏩ 栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函 数,没有局部变量,也就没有我们如今看到的所有的计算机语言。...在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出 栈(First...函数开辟的,就是main函数的栈空间,这一段空间中将存储main函数中的局部变量,临时数据已经调试信息等。

    60310

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

    函数的使用也要开辟栈 esp存入函数低位置的地址,叫做栈顶指针,ebp存入函数高位置的地址,叫做栈底指针。...打开反汇编,我们可以看到汇编语言对程序的操作,这里push叫压栈,push ebp就是将一个叫做ebp的量压到栈顶上边(这里涉及到监视窗口可以监视到ebp确实是地址小于的正好在 __tmainCRTStartup...,这是call指令的下一条指令,以便call返回时继续使用 这里的汇编语言指令在前面都说到过,我们跳过继续说 注意这里先传b再传a,传参的顺序是从右往左的,在汇编指令中我们可以很明显的发现...20h了,也就是z的值给了c:z在销毁前把值传给eax,eax在00C21453这一步时将值传给ebp-20h,在这个位置的值就是c。...到现在,我把函数栈的创建和销毁的过程大致梳理了一遍,我在学完之后有一种恍然大悟的感觉,希望这篇能够帮到大家。

    9310

    C语言进阶】数据如何安家?C语言内存中的存储艺术深度解析

    C语言,作为一门历史悠久且功能强大的编程语言,其直接操作内存的能力使得它在处理复杂数据结构和高性能数据存储方面展现出独特的优势。...因此,深入理解C语言中的数据存储机制,对于任何希望成为高效程序员或系统分析师的学习者而言,都是不可或缺的一步 本文旨在为读者揭开C语言数据存储的神秘面纱,从最基本的变量类型与内存分配讲起,我们将通过理论讲解与实例演示相结合的方式...,帮助读者构建扎实的C语言数据存储知识体系,掌握如何在C语言中高效、安全地处理各种类型的数据 让我们一同踏上这段探索C语言数据存储奥秘的旅程,开启编程世界的新篇章!...总结 在深入剖析C语言数据在内存中的存储这一漫长而精妙的旅程即将画上句号之际,我们不禁为这一编程语言所展现出的底层魅力和强大能力所折服。...C语言中的数据存储与内存管理远不止于此。随着对C语言深入学习的推进,我们还将面临更多挑战与机遇,比如动态内存分配与释放、内存泄漏的检测与预防、缓冲区溢出的防范等。

    12810

    c语言解析xml文档

    可扩展标记语言是一种很像超文本标记语言的标记语言。 它的设计宗旨是传输数据,而不是显示数据。 它的标签没有被预定义。...它是W3C的推荐标准。 二、可扩展标记语言和超文本标记语言之间的差异 它不是超文本标记语言的替代。 它是对超文本标记语言的补充。...它和超文本标记语言为不同的目的而设计: 它被设计用来传输和存储数据,其焦点是数据的内容。...超文本标记语言被设计用来显示数据,其焦点是数据的外观。 超文本标记语言旨在显示信息,而它旨在传输信息。 对它最好的描述是:它是独立于软件和硬件的信息传输工具。...Libxml2 是个C语言的XML程式库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,及部分的支持XSLT转换等功能。

    2.6K20

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

    三、函数栈的创建和销毁解析 1、什么是栈?...栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。         ...在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈 push),也可以将已经压入栈中的数据弹出(出栈 pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈(First...转入目标函数 jump:通过修改eip,转入目标函数,进行调用 ret:恢复返回地址,压入eip,类似pop eip命令 lea:预加载,装入有效地址的意思,它的操作数就是地址 3、解析函数栈的创建和销毁...,这就是局部的变量的创建和初始化 //其实是局部变量的创建时在局部变量所在函数的栈空间中创建的 //调用Add函数 c = Add(a, b); //调用Add函数时的传参 //其实传参就是把参数push

    11810

    C语言中如何实现数据帧封装与解析

    C语言中如何实现数据帧封装与解析在计算机网络通信中,数据的封装与解析是非常重要的环节。本文将介绍一种基于C语言的实现方法,旨在帮助读者理解数据的结构和实现过程。...6C语言中如何实现数据帧封装与解析1. 引言数据是网络通信中数据传输的基本单位,它包含了数据的载荷和控制信息。数据的封装与解析是为了将数据按照一定的格式打包和解析,以确保数据的可靠传输和正确解析。...接下来,我们将详细介绍C语言中如何实现数据的封装与解析。2. 数据的结构数据一般包括起始标志、目的地址、源地址、长度、数据检验序列等字段。...总结本文介绍了基于C语言数据帧封装与解析的实现方法。通过定义数据的结构体,并编写相应的封装和解析函数,我们可以实现数据C语言中的处理。...数据的封装和解析是网络通信中必不可少的环节,在实际应用中需要根据具体的需求进行适当的扩展和优化。希望本文能够帮助读者更好地理解C语言数据的封装与解析过程,并为网络通信的开发提供一些思路和参考。

    55400

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

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

    54020

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

    一、究竟什么是函数栈      C语言的使用是面向过程的, 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。...所以C语言的程序都是以函数作为基本单位的,如果能够深入理解函数,无疑对于c语言会有更深刻地理解,修炼自己的内功,那么函数是如何调用的?函数返回值是如何返回的?...在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出 栈(First...相关汇编命令: mov:数据转移指令 push:数据入栈,同时esp栈顶寄存器也要发生改变 pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变 sub:减法命令 add:加法命令 call:...转入目标函数 jump:通过修改eip,转入目标函数,进行调用 ret:恢复返回地址,压入eip,类似pop eip命令 3.3 函数栈的创建与销毁解析 3.3.1 预备知识 1、每一次函数调用,都需要为本次函数调用开辟空间

    42410

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

    什么是函数栈 我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。 那函数是如何调用的?函数的返回值又是如何返回的?函数参数是如何传递的?...每一个函数调用都要在栈区穿件一个空间 寄存器 寄存器是 CPU 内部用来存放数据的一些小型 存储区域 ,用来暂时存放参与运算的数据和运算结果。...= 0; c = Add(a, b); printf("%d\n", c); return 0; } 首先我们先建立main函数的栈空间,但我们思考一下,main函数是不是也有可能被其他函数调用那...最后将承载着z的值也就是两数和的值的寄存器eax,将值付给ebp-20h也就是c的地址  此时c就为30了  结论 局部变量是怎么创建的 创建好函数栈后,我们初始化一部分函数空间,而局部变量就在这个空间里分配一个空间...,返回值是通过寄存器存储,保护数据在调用的函数栈销毁时不丢失,再通过寄存器将值放入对应的主函数空间

    12510

    C语言中.h和.c文件解析

    :理论上来说C文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体,只要在任何一个C文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以C文件为单位的,如果不在任何...当然这些东东都成了C标准,就算不看人家的头文件,你一样可以知道怎么使用   c语言中.c和.h文件的困惑   本质上没有任何区别。...main在运行时就会找到这个定义了这个函数的aaa.c文件。   这是因为:   main函数为标准C/C++的程序入口,编译器会先找到该函数所在的文件。   ...正确的概念是:从C编译器角度看,.h和.c皆是浮云,就是改名为.txt、.doc也没有大的分别。换句话说,就是.h和.c没啥必然联系。....但是如果.c中的函数也需要调用同个.c中的其它函数,那么这个.c往往会include同名的.h,这样就不需要为声明和调用顺序而发愁了(C语言要求使用之前必须声明,而include同名.h一般会放在.c的开头

    3K40

    深度解析C语言文件操作

    既然是通讯录就应该记录下来,只有我们自己选择删除数据得时候,数据才不复存在。这就涉及到了数据得持久化得问题,我们一般数据持久化得方法有,把数据存放在磁盘文件、存放到数据库等方式。..._flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; }; typedef struct _iobuf FILE; 不同C语言编译器的...%d %f",&s.c,&s.i,&s.f); fprintf(pf, "%c %d %f", s.c, s.i, s.f); fclose(pf); pf = NULL; return 0;...如果从磁盘向计算机读入数据,则从磁盘文件中读取数据到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区地大小根本根据C编译系统决定。...(10000); fclose(pf); //注:fclose在关闭文件的时候,也会刷新缓冲区 pf = NULL; return 0; } 由此我们可以得出一个结论: 因为有缓冲区的存在,C语言再操作文件的时候

    10810
    领券