我可以为升序堆栈增长方向配置ARM处理器吗?

时间:2009-05-25 11:49:26

标签: stack arm

这里有一个问题涉及堆栈增长方向。 Michael Burr在ARM处理器中回复说过,可以配置堆栈增长方向 - 即,降序(正常行为)堆栈在内存中向零地址(低地址)增长或升级,即堆栈在内存中向更高地址增长。

What is the direction of stack growth in most modern systems?

我的问题是:在ARM处理器中,如何使堆栈在向上的方向上增长?

如何将堆栈配置为升序,默认情况下它是降序?任何寄存器位设置/复位等

3 个答案:

答案 0 :(得分:6)

嗯,ARM处理器没有直接维护堆栈 - 但它们确实有针对这些设计的指令:LDM和STM。因此,如果您在函数的开头使用STMDB,最后使用LDMIA,那么您实际上有一个完整的+降序堆栈:我记得使用的汇编程序允许您将“STMFD”和“LDMFD”写为别名。 (“完整”堆栈是堆栈指针指向堆栈上最新字的堆栈,而不是下一个要使用的位置)

所以这不是你可以在运行时简单地重新配置的东西:虽然如果你用自己的调用约定编写自己的操作系统,你可以选择使用升序堆栈。同样,您也可以选择不使用R13作为堆栈指针 - 这也只是调用约定的一部分。这种选择有效地嵌入到使用堆栈的每个函数的实现中。

答案 1 :(得分:1)

你有 __ user_initial_stackheap()功能,它可以帮助你使用Stack-Start,Stack-End和amp;更改SP。堆重定位使用Heap-Start,Heap-End。此函数可以在初始化期间使用,因为ARM将使用它来重定向堆栈和堆。

此外,您可以选择使用单区域或双内存模型[根据您的要求]。我在编写使用ARM926EJ-S的UseCases时使用过这个API。

This文档在我的开发过程中有所帮助,也可能对您有所帮助。

希望这有帮助。

-hjsblogger

答案 2 :(得分:0)

哼哼拇指/拇指2可能会限制你推/弹,只有拇指2只有ARM在那里我不知道我们可以一般说你可以双向。传统的手臂指令,是的,你可以ldmia或ldmdb(之前或之前递增)和stmdb和stmia。例如,如何使C编译器在地址中爬升而不是自动向下?不知道。

它就像ARM上的大端,只是因为它可能你不想因为它带来的头痛而带来。