2012-02-28 49 views
2

为什么当你将一个值压入堆栈时,ESP寄存器减少(而不是增加),当你弹出一个值时,ESP寄存器增加(而不是减小) ?这一点对我来说很直观。ASM - 推动/弹出

+1

有几次,我不得不使用一个堆栈,它*向上增长,* *对我来说非常直观。 – harold 2012-02-28 09:20:40

回答

6

这就是因为这种方式堆栈“从上到下”增长,反对堆,这是分配在自下而上。

在地址空间有限的架构上,这是一个设计决策,您可以更加灵活地使用它们 - 只有分配的内存区域的总和不能超过某个限制。

现在堆栈和堆地址空间总是保存在独立的内存区域,但他们决定保持向后堆栈。

1

这或多或少是任意的设计选择。如果堆栈指针在推动时递增并且在弹出时递减,则堆栈将同样适用。在某些语言中,文字是从左到右而不是从左到右书写的,而具体的方向并不能使语言更好或更差。

1

对于一个单一的内存系统,现在仍然存在于程序员面临的许多环境中,您可能会从低地址向高地址增长堆栈,并且堆栈从内存高地址的顶端向下逐渐降低地址,最大限度地利用该内存而不会发生碰撞。如果他们都长大了,就需要让他们以一种痛苦和丑陋的方式跳跃,或者尽管拥有可用的记忆,但其中一个或另一个将受到限制。在许多处理器上,您可以自由地重写malloc或创建自己的堆栈,并使堆栈长大(某些指令集可以任意选择,某些方式无需额外的努力就可以),堆堆放下来。尽管如此,尽管如此,堆栈还是会堆积起来并堆积起来。