这是一个非常基本的问题,与 ARM 和其他基于寄存器的机器中的堆栈实现有关。LDM 和 STM 命令可用于在内存和一组通用寄存器之间移动多个值,以进行堆栈操作或块复制。LDM 或 STM 操作似乎不会改变我们如何实现堆栈的规则,并有助于减少执行多次传输所需的代码长度(例如,在函数开始和结束时对多个寄存器内容进行通用传输)。但是,在从内存中加载值之后,加载的寄存器是否表现得像一个堆栈,目前还不清楚。
对于堆栈是在外部存储器、寄存器或两者的组合中实现的,我有点困惑。
谢谢你的建议!
栈是内存。一些处理器它是一个特殊的内部存储器,但它是内存,通常它实际上只不过是一个指向系统内存的堆栈指针寄存器,它由程序员(操作系统和/或应用程序)来确保他们的堆栈指针不指向某些用于其他用途的内存。
这个想法是你有一组有限的寄存器,即使你有足够多的寄存器,可能有时你想做递归或其他一些需要你重新使用一些寄存器用于某事的事情别的。堆栈提供了一个简单/快速的 malloc 并且基本上是免费的,用于临时存储事物、寄存器或局部变量或返回地址或您需要临时存储的任何内容。
如果你有很多,为什么你会使用堆栈而不是 ram 甚至寄存器,是因为使用堆栈你可以如提到的那样做递归,你可以输入相同的代码几次/数百次,例如该代码可能有一些局部变量,您可以跟踪每个局部变量的所有这些单独的实例,如果需要的话,可以有数百个副本。因为你使用堆栈的方式是相对于堆栈指针的,所以你没有硬编码的地址你有一个对堆栈指针的硬编码引用,所以如果你一次进入函数并且堆栈指针恰好在 0x1000 你的第一个变量然后可能位于 0x1000,第二个位于 0x1004,例如,您的函数可能会将 16 个字节的信息“添加”到堆栈中,然后调用自身,这一次当它进入堆栈时,指针将位于 0xFF0,
ARM 架构在寄存器中没有任何可能的堆栈实现。ARM 在 ARM 模式下有 16 个通用寄存器,并且 r13 也被定义为Stack Pointer / SP
在某些情况下被存储起来,因此您可以获得处理嵌套调用的硬件支持。除此 ARM 架构外,不提供任何额外的堆栈支持。
对于提供堆栈实现而不是在内存中的体系结构,请参阅有关寄存器或专用内存中的堆栈的Wikipedia 文章。