这里有一个关于堆栈增长方向的问题。Michael Burr回答说,在ARM处理器中,堆栈增长方向可以配置-即,要么下降(正常行为)堆栈向内存中的零地址(较低地址)增长,要么上升,即堆栈向内存中的较高地址增长。
What is the direction of stack growth in most modern systems?
我的问题是:在ARM处理器中,如何才能使堆栈向上升方向增长?
如何将堆栈配置为升序,因为它默认是降序的?任何寄存器位设置/复位等。
发布于 2009-05-25 12:02:06
ARM处理器并不直接维护堆栈--但它们确实有专门针对这一点而设计的指令: LDM和STM。因此,如果在函数的开头使用STMDB,在函数的末尾使用LDMIA,那么实际上就有了一个full+descending堆栈:我记得使用的汇编程序允许您将"STMFD“和"LDMFD”写成别名。(“完整”堆栈是指堆栈指针指向堆栈上的最新字,而不是要使用的下一个位置)
因此,它不是您可以在运行时简单地重新配置的东西:尽管如果您正在使用自己的调用约定编写自己的操作系统,您可以选择使用升序堆栈。同样,您也可以选择不使用R13作为堆栈指针-这也只是调用约定的一部分。这种选择有效地嵌入到使用堆栈的每个函数的实现中。
发布于 2009-10-13 09:36:21
您可以使用__user_initial_stackheap()函数来帮助您使用堆栈-开始、堆栈-结束和堆重新定位来更改SP。此函数可在初始化期间使用,因为ARM将使用此函数来重定向堆栈和堆。
此外,您可以选择使用单区域或双内存模型,具体取决于您的需求。我在编写使用ARM926EJ-S的UseCases时就使用过这个接口。
文档在我的开发过程中很有帮助,也可能对您有帮助。
希望这能有所帮助。
-hjsblogger
发布于 2009-05-26 17:03:31
嗯,拇指/拇指2可能会限制你的推送/弹出,而由于thumb2只有手臂,我不知道我们能不能一般化地说你可以两者兼得。传统的arm指令,是的,你可以选择ldmia或ldmdb (之后递增或之前递减)以及stmdb和stmia。例如,如何让C编译器在地址中向上攀升,而不是自动向下?不知道。
这就像手臂上的大端字节序,因为你可以,你可能不想,因为它带来了头痛。
https://stackoverflow.com/questions/906443
复制相似问题