在嵌入式系统移植时,一直有一个相关概念就是堆栈。很多资料都说堆栈是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:以字节为单位将数据(对于3