- 13
- 0
- 约5.08千字
- 约 7页
- 2017-06-24 发布于湖北
- 举报
函数调用 堆栈最近在学习嵌入式系统移植时,一直有一个相关概念就是堆栈。很多资料都说堆栈是c语言里函数调用的基础。具体,堆栈在c语言里和在系统里有哪些具体的作用。我在网上和书上查了一下资料,现在总结一下,以供大家参考。我们一般说堆栈的时候都强调堆栈是函数调用时把被调用的函数所需参数压入栈中,以实现函数的调用。但是,函数调用具体是怎么实现的,我们一般不讲。现在总结一下堆栈的具体作用:1,传递参数(为被调用函数提供参数)2,保存局部变量3,保存中间变量4,在系统中用堆栈保存任务的状态(例如各个寄存器的值)堆栈有后进先出的特性,所以能帮我们做很多事情。一会我们通过实例分析时你就会有感触。下面先说一下看下面的具体事例分析时所需要的基础知识:1.什么是堆栈????? 编译器一般使用堆栈实现函数调用。堆栈是存储器的一个区域,嵌入式环境有时需要程序员自己定义一个数组作为堆栈。Windows为每个线程自动维护一个堆栈,堆栈的大小可以设置。编译器使用堆栈来堆放每个函数的参数、局部变量等信息。????? 函数调用经常是嵌套的,在同一时刻,堆栈中会有多个函数的信息,每个函数占用一个连续的区域。一个函数占用的区域被称作帧(frame)。【每个函数都占有一个帧区。就是为了区分开这个函数的框架,一会我们分析具体实例时,我们就会有体会了】????? 编译器是从高地址开始使用堆栈。?????? 在多线程(任务)环境,CPU的堆栈指针指向的存储器区域就是当前使用的堆栈。切换线程的一个重要工作,就是将堆栈指针设为当前线程的堆栈栈顶地址。?????? 不同CPU,不同编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一样的。【我们说的是x86机器的,因为我们比较容易做实验】1.1堆栈相关寄存器:esp:堆栈指针(stack pointer),指向系统栈最上面一个栈帧的栈顶ebp: 基址指针(base pointer),指向系统栈最上面一个栈帧的底部cs:eip:指令寄存器(extended instruction pointer),指向下一条等待执行的指令地址注:ebp在C语言中用作记录当前函数调用基址。1.2堆栈操作push:以字节为单位将数据(对于32位系统可以是4个字节)压入栈,从高到低按字节依次将数据存入ESP-1、ESP-2、ESP-3、ESP-4的地址单元。pop:过程与PUSH相反。call:用来调用一个函数或过程,此时,下一条指令地址会被压入堆栈,以备返回时能恢复执行下条指令。leave:当调用函数调用时,一般都有这两条指令:pushl %ebp???movl %esp, %ebp??而,leave是这两条指令的反操作。ret:从一个函数或过程返回,之前call保存的下条指令地址会从栈内弹出到EIP寄存器中,程序转到CALL之前下条指令处执行。注:call指令的两个作用①将下一条指令的地址A保存在栈顶②设置eip指向被调用程序代码开始处1.3函数堆栈框架的形成(C语言中)①执行call XXX之前cs : eip原来的值指向call下一条指令,该值被保存到栈顶然后cs : eip的值指向xxx的入口地址②进入 XXX第一条指令: pushl %ebp????????????????? //意为保存调用者的栈帧地址第二条指令: movl %esp, %ebp??????? //初始化XXX的栈帧地址然后函数体中的常规操作,可能会压栈、出栈③退出XXXmovl %ebp,%esppopl %ebpret2.函数调用约定????? 函数调用约定包括传递参数的顺序,谁负责清理参数占用的堆栈等,如下面这个主要的函数约定表显示的:????????????????????? 函数调用约定??????????????? 参数传递顺序? 谁负责清理参数占用的堆栈???????????????????? __pascal?????????????????????? 从左到右???????? 调用者???????????????????? __stdcall?????????????????????? 从右到左???????? 被调函数???????????????????? __cdecl???????????????????????? 从右到左???????? 调用者????? 调用函数的代码和被调函数必须采用相同的函数的调用约定,程序才能正常运行。在Windows上,__cdecl是C/C++程序的缺省函数调用约定。在linux下gcc默认用的规则是__stdcall?(一会我们分析的函数就是在linux下用c语言源码和反汇编语言对比分析一下函数调用的具体实现)????? 在有的cpu上,编译器会用寄存器传递参数,函数使用的堆栈由被调函数分配和释放。这种调
您可能关注的文档
- 第一章 C语言while、do-while、for循环 课程5.docx
- VC实现进程遍历四种方法.doc
- 无线光通信OOK、PPM、DPPM性能分析研究幻灯片.doc
- 经销商怎样提升终端管理技能 答案.docx
- 炼钢工艺知识讲述.ppt
- 社会工作及管理自考科目心理咨询及心理治疗.doc
- 第十三章 计算机系统结构模拟试题.doc
- 在查找Lookup运用查到lookup初级到高级篇.docx
- 第十一章 华师教育科学研究方法作业.doc
- 宽带IP网络 第二次阶段作业讲述.doc
- 河北盐山中学等校2025-2026学年上学期高三一模化学试卷(含解析).docx
- 河北正定中学2025-2026学年高一上学期期末考试物理试卷(含解析).docx
- 河北张家口市怀安县2025-2026学年第一学期期末教学综合评价八年级地理试卷(含解析).docx
- 河南安阳市殷都区2025-2026学年第一学期期末教学质量检测七年级地理试卷(含解析).docx
- 河南安阳市滑县2025一2026学年第一学期期末学业质量监测八年级地理试题(含解析).docx
- 河南安阳市林州市2025-2026学年上学期期末考试高一政治试题(含解析).docx
- 河南焦作市武陟县第一中学2025-2026学年高一上学期1月月考语文试卷(含解析).docx
- 河南济源市2025-2026学年上学期期末学业质量调研七年级历史试卷(含解析).docx
- PICC导管并发症的紧急处理与护理.pptx
- 河南鹤壁市2025-2026学年高二上学期期末考试生物试题(含解析).docx
最近下载
- 长庆一氧化碳中毒事故案例分析.ppt VIP
- 2019创新思维考试.doc VIP
- 数学人教版九年级上册用列举法求概率.2用列举法求概率.pptx VIP
- 《工厂供电》课设计指导书.doc VIP
- 《历代名画记》与《法书要录》.docx VIP
- 心电监护常见心律失常的识别及处理医学64页PPT.pptx VIP
- (网络参考版)广西2025年高考真题历史试卷(含答案).docx VIP
- 中兴VUE-NR高级认证(52-115)练习试题.doc VIP
- 基于改进YOLOv5s算法的城市道路交通场景目标检测研究.pdf VIP
- 高中英语高考复习动词时态专项练习(共70题,附参考答案和解析).docx VIP
原创力文档

文档评论(0)