初学ARM指令时,一直纠结满堆栈与空堆栈,按字面意思理解,也即数据结构上的定义,空堆栈就是没有放数据的堆栈,而满堆栈就是放满的堆栈。
but注意看书上的定义呀啊:
- 空堆栈:当堆栈指针指向下一个空位置时,称为空堆栈
- 满堆栈:如果堆栈指针总是指向最后压入堆栈的数据,称为满堆栈
所以,这里的空满根本不表示堆栈的存储状态,只是来说明堆栈指针指向的存储单元是否已经保存有堆栈数据,或者说入栈时是否可以直接向堆栈指针指向的存储单元写入数据。这就是“满堆栈”与“空堆栈”。博主的理解就是,空满只是表示指针指向单元的状态。
接下来再来说说什么叫向上增长和向下增长,递增堆栈和递减堆栈,哎呀呀,当时对这个定义也是傻傻分不清。
- 递增堆栈:向高地址方向生长
递减堆栈: 向低地址方向生长
用个不是很形象的图来示意一下,老师上课的课件:
为什么说“向上生长”和“向下生长”呢?那是以为,一般画堆栈示意图都是把低地址画在下面,高地址画在上面。
OK,那么再来说说与之相关的后缀问题:
- 索引后缀(IA,IB,DA,DB)----用于数据块的传送,地址基址不能用SP(R13)寄存器
先说明字母代表含义,方便记忆
I–Icrement
A—After
B–Before
D–Decrement
IA—事后递增,即每次传递后基址加4,指向下一个字
IB—事先递增,即每次传递前基址加4,指向本次传送的字所在存储单元
DA—事后递减,即每次传递后地址减4,指向下一个字
DB—事前递减,即每次传递前地址减4,指向本次传送的字
- 堆栈后缀(FD,FA,ED,EA)----地址基址必须使用SP(R13),堆栈堆栈嘛肯定是使用堆栈区了
F—Full
D—Descending(减)
E–Empty
A—Ascending(增)
再来讨论下块复制问题:
具体使用哪条指令,还要基于数据存储在基址寄存器之上还是之下,地址在存储第一个之前还是之后增加。
相应指令搭配看下图:
就以第一个框里的STMIB STMFA为例说明
STMIB:传递前递增(索引方式)
SYMFA:满递增堆栈