转自:http://blog.csdn.net/itismine/article/details/4864159
关于堆栈寻址
堆栈是一块连续的内存,也可以说是存储区,不过因为作为特定的数据结构,它对数据存储顺序是有要求的,即先进后出(或者说是后进先出)。堆栈寻址时,使用SP指向一块存储区域,指针所指向的单元就是堆栈的栈顶。存储器堆栈可以分为两种:
堆栈是一块连续的内存,也可以说是存储区,不过因为作为特定的数据结构,它对数据存储顺序是有要求的,即先进后出(或者说是后进先出)。堆栈寻址时,使用SP指向一块存储区域,指针所指向的单元就是堆栈的栈顶。存储器堆栈可以分为两种:
一种是向上生长,就是向着高地址方向生长,称为递增堆栈。
一种是向下生长,就是向着低地址方向生长,称为递减堆栈。
另外,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要放入的空位置,称为空堆栈。这样,就有四种组合:满递增、空递增、满递减、空递减。
(D代表Descending,A代表Ascending,F代表Full,E代表Empty)
写程序通过分析结果来理解堆栈寻址是一种最好的方法,形象直观。现在根据汇编实验分析结果对上述堆栈寻址作出总结。
入栈规律:
(1)满堆栈操作先调整SP,然后存入数据。
(2)空堆栈操作先存入数据,然后调整SP。
(3)递增堆栈调整SP时,执行SP=SP+4
(4)递减堆栈调整SP时,执行SP=SP-4
出栈规律正好与入栈相反,也就是入栈的逆操作。
(1)空堆栈操作先调整SP,然后存入数据。
(2)满堆栈操作先存入数据,然后调整SP。
(3)递减堆栈调整SP时,执行SP=SP+4
(4)递增堆栈调整SP时,执行SP=SP-4
明确了这四个规律,就很容易分析各种堆栈寻址方式对应的堆栈分布情况了。
stmfd sp!, {r4-r11}
假设初始SP为0x0400,那么执行完毕后内存0x03E0-0x03FF保存寄存器R4-R11的内容。
stmed sp!, {r4-r11}
假设初始SP为0x0400,那么执行完毕后内存0x03E4-0x0403保存寄存器R4-R11的内容。
实际应用中,只选用一种方式使用就可以了。最常用最典型的就是后缀为“FD”时的结构,这是人们熟悉的堆栈结构。
stmfd sp!, {r4-r11, lr} /*入栈*/
ldmfd sp!, {r4-r11, lr} /*出栈*/
本文详细介绍了堆栈的概念及其在不同寻址模式下的工作原理,包括递增与递减堆栈的区别,以及满堆栈与空堆栈的操作方式。通过具体的汇编指令示例,解释了如何进行入栈和出栈操作。
8768

被折叠的 条评论
为什么被折叠?



