Memory 东西是如何存储在堆栈中的?

Memory 东西是如何存储在堆栈中的?,memory,assembly,stack,Memory,Assembly,Stack,所以我一直在学习汇编,开始学习堆栈,存储本地、静态和全局变量等内容 但我很难在脑海中想象 内存底部但堆栈顶部:S whaa 让我困惑的是,每次有东西被推入堆栈,堆栈指针就会被减去。这不应该增加它吗 我的意思是我得到了代码,但很难不知道到底发生了什么 将其视为一个实现细节。在许多体系结构中,当您将某个内容推送到堆栈上时,堆栈指针会被减去,因此堆栈会向下增长到较小的地址。仅此而已。将其视为一个实现细节。在许多体系结构中,当您将某个内容推送到堆栈上时,堆栈指针会被减去,因此堆栈会向下增长到较小的地址。

所以我一直在学习汇编,开始学习堆栈,存储本地、静态和全局变量等内容

但我很难在脑海中想象

内存底部但堆栈顶部:S whaa

让我困惑的是,每次有东西被推入堆栈,堆栈指针就会被减去。这不应该增加它吗


我的意思是我得到了代码,但很难不知道到底发生了什么

将其视为一个实现细节。在许多体系结构中,当您将某个内容推送到堆栈上时,堆栈指针会被减去,因此堆栈会向下增长到较小的地址。仅此而已。

将其视为一个实现细节。在许多体系结构中,当您将某个内容推送到堆栈上时,堆栈指针会被减去,因此堆栈会向下增长到较小的地址。仅此而已。

之所以这样做,是因为堆栈与堆共享相同的内存块。堆从顶部低位地址增长到底部高位地址编号,而堆栈从底部高位地址编号增长到顶部低位地址编号

这样做是为了不需要预测两次内存量—一次是堆,另一次是堆栈


希望这能有所帮助。

之所以这样做,是因为堆栈与堆共享相同的内存块。堆从顶部低位地址增长到底部高位地址编号,而堆栈从底部高位地址编号增长到顶部低位地址编号

这样做是为了不需要预测两次内存量—一次是堆,另一次是堆栈


希望这有帮助。

减小SP的原因很简单*堆栈是从内存位置的底部添加到的。这有点像你有一张待办事项清单。您可以从页面顶部开始,而不是像我们通常做的那样在列表中随机标记单个内容,您只需要开始并完成页面最下面的工作

使用从顶部(即堆栈的更高地址)的内存的原因是,它允许另一个重要的内存存储,堆至少向另一个方向增长,这在某些内存模型中是如此。继续做“待办事项清单”的类比,现在您还可以从页面底部编写另一个清单,比如杂货清单。然而,这个列表是堆,你可以让自己在随机的地方擦除其中的内容,当你在商店中穿行时,也可以重新使用一些被擦除的行留下的空间

现在,堆栈管理的另一个重要元素是a的概念,这是一种方便的方法,可以将参数存储到函数和局部变量中,它们对应于嵌套函数调用的整体上下文


*也就是说,在许多CPU上。正如Pierr所指出的,有些CPU使用的堆栈会将SP向上移动,当有东西推到SP上时会增加SP。

减少SP的原因很简单,就是*堆栈是从内存位置的底部添加的。这有点像你有一张待办事项清单。您可以从页面顶部开始,而不是像我们通常做的那样在列表中随机标记单个内容,您只需要开始并完成页面最下面的工作

使用从顶部(即堆栈的更高地址)的内存的原因是,它允许另一个重要的内存存储,堆至少向另一个方向增长,这在某些内存模型中是如此。继续做“待办事项清单”的类比,现在您还可以从页面底部编写另一个清单,比如杂货清单。然而,这个列表是堆,你可以让自己在随机的地方擦除其中的内容,当你在商店中穿行时,也可以重新使用一些被擦除的行留下的空间

现在,堆栈管理的另一个重要元素是a的概念,这是一种方便的方法,可以将参数存储到函数和局部变量中,它们对应于嵌套函数调用的整体上下文

*也就是说,在许多CPU上。正如Pierr所指出的,有些CPU使用堆栈,当有东西推到SP上时,它会向上移动SP并增加SP

让我困惑的是,每次有东西被推入堆栈,堆栈指针就会被减去。这不应该增加它吗

可能是。这取决于堆栈是向上增长还是向下增长

让我困惑的是,每次有东西被推入堆栈,堆栈指针就会被减去。这不应该增加它吗

可能是。这取决于堆栈是向上增长还是向下增长


确实,在许多CPU体系结构上,当有东西被推到堆栈上时,堆栈指针会减少 那一堆。这实际上是CPU的一个实现细节,但如果您发现这一点令人困惑,您可以尝试将堆栈可视化,就像在下图中所做的那样:

资料来源:

内存地址会随着下移而增加,但当您想将某个内容推到堆栈顶部时,可以将其放在图表顶部较低的地址处


该图位于。

在许多CPU体系结构上,当有东西被推到堆栈上时,堆栈指针确实会减少。这实际上是CPU的一个实现细节,但如果您发现这一点令人困惑,您可以尝试将堆栈可视化,就像在下图中所做的那样:

资料来源:

内存地址会随着下移而增加,但当您想将某个内容推到堆栈顶部时,可以将其放在图表顶部较低的地址处


图可以在中找到。

堆栈向下生长,堆向上生长,这样您就不必决定每个堆栈的数量。事实上,事情比现在更复杂了,但x86和其他版本的机器操作内置了这种假设。在任何情况下,这都无关紧要,机器加和减都一样好。

堆栈向下生长,堆向上生长,这样你就不必决定每一个加多少。事实上,事情比现在更复杂了,但x86和其他版本的机器操作内置了这种假设。在任何情况下,这都无关紧要,机器的加和减都一样好。

堆栈的顶部与堆栈在内存中的布局无关

这是一个数据结构。堆栈类比是一个概念模型,它在内存空间中向上或向下增长的事实只是一个实现细节。见鬼,它使用连续内存块的事实仅仅是一个实现细节;例如,如果您将其实现为一个链表,您很可能拥有一个项目分散在各地的堆栈

它甚至不是一个真正的堆栈:考虑一下,即使教科书说它是一个先进先出,实际上你可以在栈的中间改变项目。

实现堆栈所需的是:

指向堆栈的每个帧/元素的方法 指向堆栈最后一个插入元素的方法,也称为堆栈顶部 到达上一个元素的方法 将图元插入末端/顶部的方法 从末端/顶部删除图元的一种方法,使其上一个图元成为新的最后一个/顶部图元。
内存布局的外观与它无关。

堆栈的顶部与堆栈在内存中的布局无关

这是一个数据结构。堆栈类比是一个概念模型,它在内存空间中向上或向下增长的事实只是一个实现细节。见鬼,它使用连续内存块的事实仅仅是一个实现细节;例如,如果您将其实现为一个链表,您很可能拥有一个项目分散在各地的堆栈

它甚至不是一个真正的堆栈:考虑一下,即使教科书说它是一个先进先出,实际上你可以在栈的中间改变项目。

实现堆栈所需的是:

指向堆栈的每个帧/元素的方法 指向堆栈最后一个插入元素的方法,也称为堆栈顶部 到达上一个元素的方法 将图元插入末端/顶部的方法 从末端/顶部删除图元的一种方法,使其上一个图元成为新的最后一个/顶部图元。
内存布局的外观与它无关。

这是一个很好的类比,但你能这样说明它只是一个意外。我建议OP不应该学着依赖它。很好的类比,但你能这样解释它只是个意外。我建议OP不要学会依赖它。
00000000 HEAP----
00000001 ||||||||
00000002 vvvvvvvv

FFFFFFFD ^^^^^^^^
FFFFFFFE ||||||||
FFFFFFFF Stack