这里有一个关于堆栈增长方向的问题。Michael Burr 回答说在 ARM 处理器中可以配置堆栈增长方向 - 即下降(正常行为)堆栈向内存中的零地址(低地址)增长或上升,即堆栈向内存中的更高地址增长。
我的问题是:在 ARM 处理器中,我怎样才能使堆栈以递增的方向增长?
如何将堆栈配置为升序,默认情况下它是降序的?任何寄存器位设置/重置等。
这里有一个关于堆栈增长方向的问题。Michael Burr 回答说在 ARM 处理器中可以配置堆栈增长方向 - 即下降(正常行为)堆栈向内存中的零地址(低地址)增长或上升,即堆栈向内存中的更高地址增长。
我的问题是:在 ARM 处理器中,我怎样才能使堆栈以递增的方向增长?
如何将堆栈配置为升序,默认情况下它是降序的?任何寄存器位设置/重置等。
嗯,ARM 处理器不直接维护堆栈——但它们确实有设计时考虑到这一点的指令:LDM 和 STM。因此,如果您在函数的开头使用 STMDB 并在结尾使用 LDMIA,那么您实际上有一个完整的+降序堆栈:我记得使用的汇编程序允许您将“STMFD”和“LDMFD”写为别名。(“完整”堆栈是堆栈指针指向堆栈上的最新单词的堆栈,而不是下一个要使用的位置)
因此,这不是您可以在运行时简单地重新配置的东西:尽管如果您正在编写自己的操作系统并使用自己的调用约定,您可以选择使用升序堆栈。同样,您也可以选择不使用 R13 作为堆栈指针——这也是调用约定的一部分。这种选择有效地嵌入到使用堆栈的每个函数的实现中。
您有__user_initial_stackheap()函数,它可以帮助您使用 Stack-Start、Stack-End 和使用 Heap-Start、Heap-End 的堆重定位来更改 SP。该函数可以在初始化期间使用,因为 ARM 会使用它来重定向堆栈和堆。
此外,您可以选择使用单区域或双内存模型[取决于您的要求]。我在编写使用 ARM926EJ-S 的 UseCases 时使用了这个 API。
该文档在我的开发过程中有所帮助,也可能对您有所帮助。
希望这可以帮助。
-hjsblogger
嗯,拇指/拇指 2 可能会限制您推送/弹出,而拇指 2 只有 ARM,我不知道我们通常可以说您可以双向使用。传统的 arm 指令,是的,您可以使用 ldmia 或 ldmdb(之后递增或之前递减)以及 stmdb 和 stmia。例如,您如何使 C 编译器在地址中上升而不是自动下降?不知道。
它就像 ARM 上的大端序,只是因为你可能不想这样做,因为它带来了令人头疼的问题。