ARM 堆栈
来源:互联网 发布:怪兽档案知乎 编辑:程序博客网 时间:2024/05/18 22:54
转载:
http://hi.baidu.com/trical/item/585a24087f9b1a036c9048f0
http://www.52rd.com/Blog/Archive_Thread.asp?SID=7626
堆栈严格来说应该叫做栈,栈(Stack)是限定仅在一端进行插入或删除操作的线性表。因此,对栈来说,可以进行插入或删除操作的一端端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含元素的空表称为空栈。由于堆栈只允许在一端进行操作,因而按照后进先出(LIFO-Last In First Out)的原理运作。
从栈顶的定义来看,栈顶的位置是可变的。空栈时,栈顶和栈底重合;满栈时,栈顶离栈底最远。ARM为堆栈提供了硬件支持,它使用一个专门的寄存器(堆栈指针)指向堆栈的栈顶。而且7种模式都有各自独立的堆栈指针,也就是有各自独立的堆栈空间。但这里的堆栈和uC/OS操作系统的任务堆栈又有区别,uC/OS的每个任务都有自己的堆栈,要是把uC/OS移植到ARM上,可以借助ARM的堆栈指针来实现。存储器堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要放入的空位置,称为空堆栈。这样就有4中类型的堆栈表示递增和递减的满堆栈和空堆栈的各种组合。
满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。
空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA,STMEA等。
满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD,STMFD等。
空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED,STMED等。
为什么说“向上生长”和“向下生长”呢?那是以为,一般画堆栈示意图都是把低地址画在下面,高地址画在上面。如下图。
有一点需要注意的是,虽然ARM处理器核对于两种生长方式的堆栈均支持,但ADS的C语言编译器仅支持一种方式,即从上往下长,并且必须是满递减堆栈。所以STMFD等指令用的最多。
堆栈寻址的命令LDMFA/STMFA、LDMEA/STMEA、LDMFD/STMFD、LDMED/STMED。
LDM和STM表示多寄存器寻址,即一次可以传送多个寄存器值。
LDM:一次装载多个,这里用来出栈。
STM:一次存储多个,这里用来入栈。
F/E表示指针指向的位置
F:full满堆栈,表示堆栈指针指向最后一个入栈的有效数据项。
E:empty空堆栈,表示堆栈指针指向下一个要放入的空地址。
A/D表示堆栈的生长方式
A:堆栈向高地址生长,即递增堆栈。
D:堆栈向低地址生长,即递减堆栈。
递增递减和硬件无关,这一般是由操作系统决定的。我们一般使用的是递减。LINUX是用递减堆栈。
所以
LDMFD SP!,{R1-R7,LR};将数据出栈,放入R1~R7,LR这8个积存器,同时SP自动更新。这是一个满递减堆栈。
STMFD SP!,{R1-R7,LR};将R1~R7,LR入栈,SP更新。满递减堆栈。
- ARM 堆栈
- ARM堆栈
- arm 堆栈
- ARM 堆栈溢出问题
- ARM堆栈方式
- ARM堆栈方式
- arm堆栈操作
- arm堆栈知识
- ARM汇编堆栈
- ARM 堆栈操作
- arm cortex 堆栈操作
- arm堆栈操作
- ARM中的堆栈形式
- ARM堆栈的分类
- ARM堆栈方式
- arm的堆栈结构
- arm堆栈的增长方式
- ARM的堆栈学习笔记
- C语言实现命令行窗口
- hibernate映射继承关系(一):一张表对应一整棵类继承树
- c# - catch(Exception ex) 会丢掉StackTrace 是怎么回事?
- eas bos 编辑界面 editUIt 属性值为空
- OpenCV中GPU模块使用
- ARM 堆栈
- 搜索Kconfig
- 选择排序
- JNI中string和jstring转换
- vim 中的编码
- typedef的用法
- 转储指定的数据块并查看TRC信息
- 内存映射文件例子
- Linux启动过程分析2