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

Posted

技术标签:

【中文标题】我可以为升序堆栈增长方向配置 ARM 处理器吗?【英文标题】:Can i configure a ARM processor for Ascending Stack growth direction? 【发布时间】:2010-10-28 17:34:27 【问题描述】:

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

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

我的问题是:在 ARM 处理器中,我怎样才能使堆栈按升序增长?

如何将堆栈配置为升序,默认为降序?任何寄存器位设置/重置等。

【问题讨论】:

【参考方案1】:

您有 __user_initial_stackheap() 函数,它可以帮助您使用 Stack-Start、Stack-End 和使用 Heap-Start、Heap-End 的堆重定位来更改 SP。这个函数可以在初始化的时候使用,因为 ARM 会使用它来重定向 Stack 和 Heap。

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

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

希望这会有所帮助。

-hjsblogger

【讨论】:

【参考方案2】:

嗯,拇指/拇指 2 可能会限制您推动/弹出,而拇指 2 只有 ARM,我不知道我们通常可以说您可以双向使用。传统的 arm 指令,是的,您可以使用 ldmia 或 ldmdb(之后递增或之前递减)以及 stmdb 和 stmia。例如,您如何使 C 编译器在地址中上升而不是自动下降?不知道。

它就像 ARM 上的大端,只是因为你可能不想这样做,因为它带来了令人头疼的问题。

【讨论】:

【参考方案3】:

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

因此,您不能简单地在运行时重新配置它:尽管如果您正在编写自己的操作系统并使用自己的调用约定,您可以选择使用升序堆栈。同样,您也可以选择不使用 R13 作为堆栈指针——这也是调用约定的一部分。这种选择有效地嵌入到使用堆栈的每个函数的实现中。

【讨论】:

很好的答案,除了 Thumb 依赖于 r13 作为堆栈指针。 啊,我确实使用了一段时间的 ARM7TDMI,但从未使用过 Thumb 模式。

以上是关于我可以为升序堆栈增长方向配置 ARM 处理器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果堆栈在数字较低的地址处增长,为啥指针比较会反转呢?

大多数现代系统中堆栈增长的方向是啥?

为啥在函数中用作局部变量时数组不会沿堆栈方向增长?

编写程序以升序对堆栈进行排序

我的堆栈是向上增长而不是向下增长吗? [复制]

STM32的中断处理流程是怎样的?与ARM7 ARM9相同吗?