关于ARM堆栈的一些问题

学习ARM寻址方式的时候,里面有种寻址为堆栈寻址。

ARM7中的寄存器R13就是作为堆栈指针SP的。堆栈内容的增减,就会影响堆栈指针的移动。这个移动方向与堆栈的生长方向有关。

ARM7的有两种堆栈生长方向。

1.向上生长 在像堆栈写入数据后,堆栈指针的值变大,也就是向高地址方向生长,这种是递增堆栈。

2.向下生长 在像堆栈写入数据后,堆栈指针的值变,也就是向地址方向生长,这种是递减堆栈。


要注意的问题不仅仅是堆栈增长方向。还要考虑到堆栈指针指向的存储单元是否已经保存有堆栈数据,或者说入栈时是否可以直接向堆栈指针指向的存储单元写入数据。这就是“满堆栈”与“空堆栈”。

1.满堆栈 堆栈指针指向最后压入栈的有效数据项,称为满堆栈。此时堆栈入栈操作要先调整指针再写入数据;

2.空堆栈 堆栈指针指向下一个待压入数据的空位置,称为空堆栈。此时堆栈的入栈操作的入栈操作要先先写入数据再调整指针。


综合以上叙述,就可以得到四种堆栈类型,分别为满递增,空递增,满递减,空递减。


  然后我想到了uc/OS-II中就有与堆栈类型密切相关的东西,移植ucOS-II到相应平台上,就要考虑到堆栈类型。我看书上说到ADS1.2堆栈类型只支持满递减。此时我的问题就出来了,堆栈类型具体应该是跟MCU有关,而不同的编译器又支持不同的类型,是不是这样呢,最后我在ADS1.2文件的一个讲ATPCS的PDF中找到了答案,原来就是这样,ADS1.2只能满递减。一下就是PDF中的截图。



你可能感兴趣的:(存储,平台,编译器)