ASM - 推/弹

时间:2012-02-28 08:30:30

标签: assembly x86

为什么当你将一个值压入堆栈时,ESP寄存器会减少(而不是增加),当你弹出一个值时,ESP寄存器会增加(而不是减少)?这对我来说是违反直觉的。

3 个答案:

答案 0 :(得分:7)

多数民众赞成因为那样堆栈从上到下“增长”,与堆相对,后者是自下而上分配的。

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

现在无论如何堆栈和堆地址空间都保存在不同的内存区域中,但是他们决定保持向后增长的堆栈。

答案 1 :(得分:1)

这或多或少是一种随意的设计选择。如果堆栈指针在推送时递增并且在弹出时减少,则堆栈将同样有效。在某些语言中,文本是从右到左而不是从左到右书写的,而特定的方向并不会使语言变得更好或更差。

答案 2 :(得分:1)

使用单个内存系统,并且仍然在程序员面临的许多环境中,您将使堆从较低地址成长到较高地址,并且堆栈从内存高位地址向下扩展到较低地址,最大限度地利用内存而不会发生冲突。如果他们都长大了,就需要让他们以一种痛苦和丑陋的方式跳过它们,或者尽管有可用的记忆,但是其中一个会被限制。在许多处理器上,您可以自由地重新编写malloc或创建自己的堆栈并使堆栈成长(某些指令集可以随意地以任何方式进行,有些不能没有额外的努力)和堆栈。最好顺其自然,让堆栈长大并堆积起来。