|
|
1
2
比你想知道的还要详细。 堆栈可以是“下降”(向下生长)或“上升”(上升)。堆栈也可以是“full”(SP指向“full”,即堆栈中已使用的条目)或“empty”(SP指向“empty”,即堆栈中未使用的条目) 大多数堆栈是“完全下降”。我觉得有几个是“空升”。另外两个(FA,ED)没有多大用处,即使只是因为不清楚 编辑: 对于“全降序”堆栈,相关ARM指令的规范助记符实际上是LDMIA(在后面加载多个增量)和STMDB(在前面存储多个减量),但是ARM决定添加LDMFD/STMFD别名,这样程序员只需记住所使用的堆栈类型。前面/后面的增量/减量是标准名称,因为ARM架构(主要)是正交的;堆栈的使用是按惯例(即EABI)而不是体系结构本身指定的东西。例外情况是r14(LR)、r15(PC)和寄存器集,它们在不同的管理模式之间被隐藏。
|
|
2
3
对于是先递减后存储还是先存储再递减有不同的约定。在任何情况下,这一点都不重要,堆栈指针只是用正确的值初始化(即:它要么指向存储第一个元素的上面的地址,要么指向存储第一个元素的地址)。 |
|
|
3
1
通常,堆栈指针指向未使用的堆栈空间和堆栈顶部的项之间的边界。在堆栈向上增长(地址向下增长)的体系结构中,这将使堆栈指针看起来像是直接指向顶部项。因为它可以被视为指向顶部的项,所以必须先更改指针,然后再进行存储。同样,在弹出过程中,首先加载项,然后更改指针。
|