2011-04-08 167 views

回答

1

我不知道你所说的“实际上堆栈”(什么是“真正的”叠加么?)的意思,但它的概念同样的事情:push递减“堆栈指针”,并pop增量它。

+0

我正在讨论使用push和流行。 – 2011-04-08 20:41:27

3

是的,后进先出堆栈使用的计算机架构来存储的东西,如返回地址,局部变量等。 From Wikipedia

x86体系结构对执行堆栈机制提供硬件支持。诸如push,pop,call和ret之类的指令用于正确设置堆栈以传递参数,为本地数据分配空间以及保存和恢复呼叫返回点。 ret尺寸指令对于实现空间有效(快速)调用约定非常有用,因为被调用者负责回收参数占用的堆栈空间。

例如,当一个函数被调用时,体系结构将返回地址,当前寄存器值等压入堆栈。当函数返回时,该数据将从堆栈弹出,以便可以在前一个位置继续执行。

1

你所说的“堆栈”是程序的调用堆栈,所以在这个意义上它是一个堆栈。但是没有必要这样做:实际的实现是硬件,操作系统和语言运行时特定的—我已经使用了C编译器,其中调用栈被实现为[双向]链接的栈帧列表,分配在堆,类似于IBM大型机操作系统的做法。

英特尔/ Windows风格的固定大小硬件堆栈的缺点是它使环境不是非常容易递归。 OTOH,它使堆栈非常高效,因为您不必使用操作系统资源来分配堆内存:它只是增加了一个指针。

2

这是一大堆内存,但有一个指向堆栈顶部的堆栈指针。在推动它上升,在弹出它下降。但是通常你可以通过修改指针来作弊,这样你就可以获得一个已经弹出的值。

并非所有架构的堆栈都朝向相同的方向。最后它根本就没有关系。一些系统使得堆栈指针在推动时增加,并且减少弹出,其他系统在推动时减少,并且增加弹出。

示例:堆栈指针位于0x100,它是一个增加的系统。 然后你按下,堆栈指针位于0x104。你再次推动,在0x108。你弹出,回到0x104。 另一个系统应该从0x100开始,向下推到0xfc,然后推到0xf8,并且弹回到0xfc。如果你再次弹出,你回到0x100。如果你从堆栈指针中减去8,它就回到0xf8,所以你可以再次弹出它们。 (或者,C编译器在函数结束时会做什么,只需从堆栈指针添加/减去12,而不是在3条指令中弹出3个局部变量。