现在我正在尝试学习x86系统上的汇编语言。因此,我正在准备“从头开始编程”一书。 (可在http://download.savannah.gnu.org/releases/pgubook/免费)计算机堆栈和Assemly语言
在第53页,计算机的堆栈的工作方式进行了说明:
计算机的堆栈住在记忆的最顶端 地址。您可以通过名为pushl的 指令将值压入堆栈顶部。 [...]嗯,我们说它是最高的,但堆栈的“顶部”实际上是堆栈内存的底部。 [...]在内存中,由于架构考虑,堆栈从 内存的顶部开始并向下增长。因此,当我们提到“堆栈顶部”时,请记住它位于堆栈底部的 内存中。
这部分我得到。假设堆栈的内存从地址0开始并在地址11结束(包含)。这意味着堆栈上目前有三个字(每个字节4个字节)。根据我的理解,堆栈顶部的单词当前占用地址8,9,10和11.(因为一个单词有4个字节,因此占用主内存中的四个存储位置)。但是,本书现在说明如下:
堆栈寄存器%esp始终包含一个指向堆栈当前顶端的指针。
好的,在我的例子中,%esp寄存器将保存地址8.它指向当前位于堆栈顶部的单词。但是......
每次我们的东西推到堆栈中有pushl,ESP%得到了4,使其指向堆栈的顶新(记住减去,每个字是四个字节长,堆栈向下增长)。
什么?这不正是其他方式吗?如果我将另一个4字节大小的机器字压入堆栈,这个字将占用主存储器地址12至15.就像他们所说的:堆栈向下增长。现在%esp寄存器指向当前位于堆栈顶部的单词。它从地址12开始。在我们将另一个单词放入堆栈之前,存储在%esp中的地址是8.因此%esp显然已被添加4,而不是相减。他们从哪里得到减法?我错过了什么?我很迷茫......
帮助是非常赞赏;)
“成长向下”仅仅意味着减法。 12 - 4 = 8,ESP得到一个较低的值,然后你推动堆栈上的东西。只要站在你的头上,一切都看起来很正常。 –