ARM - 使用加载/存储多个寄存器值实现堆栈

时间:2013-08-13 21:14:06

标签: stack arm

这是一个非常基本的问题,与ARM和其他基于寄存器的机器中的堆栈实现有关。 LDM和STM命令可用于在存储器和一组通用寄存器之间移动多个值,以进行堆栈操作或块复制。 LDM或STM操作似乎不会改变我们如何实现堆栈的规则,并且有助于减少执行多次传输所需的代码长度(例如,在函数的开始和结束时共同传输多个寄存器内容)。但是,在从内存加载值之后,不清楚加载的寄存器是否像堆栈一样。

关于堆栈是在外部存储器,寄存器还是两者的组合中实现,我有点困惑。

先谢谢!

2 个答案:

答案 0 :(得分:2)

堆栈是内存。一些处理器它是一个特殊的内部存储器,但它是内存,通常它只是一个指向系统内存的堆栈指针寄存器,由程序员(操作系统和/或应用程序)来确保它们的堆栈指针并不指向某些用于其他内存的内存。

这个想法是你有一组有限的寄存器,即使你有足够多的寄存器,例如你可能有时间做递归或其他一些需要你重新使用某些寄存器的东西。用于别的东西。堆栈提供简单/快速的malloc和free,基本上用于临时存储事物,寄存器或本地变量或返回地址或临时存储的任何内容。

为什么你会使用堆栈而不是ram甚至是寄存器(如果你有很多),就像你可以提到的堆栈一样,例如做递归,你可以输入相同的代码几次/几百次,例如代码可能有一些局部变量,你可以跟踪每个局部变量的所有单个实例,如果需要,可以跟踪数百个副本。因为你使用堆栈的方式是相对于堆栈指针,你没有硬编码的地址,你有一个硬盘编码引用堆栈指针,所以如果你输入函数一次,堆栈指针恰好是0x1000你的第一个变量例如,你的函数可能会将“16”字节的信息“添加”到堆栈然后调用自身,这次它进入堆栈指针时将处于0xFF0,并且你的第一个变量位于0x1004 0xFF0和0xFF4处的第二个,依此类推,直到你的堆栈指针与其他东西发生碰撞或者你完成了。

答案 1 :(得分:1)

ARM体系结构在寄存器中没有任何可能的堆栈实现。 ARM在ARM模式下有16个通用寄存器,r13也定义为Stack Pointer / SP,它在某些情况下被归档,因此您可以获得处理嵌套调用的硬件支持。除此之外,ARM体系结构不提供对堆栈的任何其他支持。

对于提供堆栈实现而非内存的体系结构,请参阅Wikipedia关于Stack - Stack in registers or dedicated memory的文章。