如何将东西存储在堆栈中?

时间:2009-10-29 05:46:45

标签: memory assembly stack

所以我一直在学习汇编,并讨论了堆栈的主题,存储了本地,静态和全局变量和东西。

但是我很难想象它在脑海中。

内存的底部,但堆栈的顶部,:S whaa ??

让我感到困惑的是,每当某些东西被推入堆栈时,堆栈指针就会被删除。不应该加入它。

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

7 个答案:

答案 0 :(得分:8)

确实,在许多CPU架构中,当推送到堆栈上时,堆栈指针减少。这实际上是CPU的一个实现细节,但是如果你发现令人困惑的话,你可以尝试将堆栈可视化,就像在这个图上完成一样:

68000 CPU stack
(来源:eventhelix.com

内存地址会随着您向下移动而增加,但是当您想要推送某些内容顶部时,您可以将其放在顶部上图(在较低的地址)。

(该图表可在EventHelix.com找到。)

答案 1 :(得分:3)

  

让我感到困惑的是,每当某些东西被推入堆栈时,堆栈指针就会被删除。不应该加入它。

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

Understand the stack

Stack grow direction

答案 2 :(得分:2)

将其视为实施细节。在许多体系结构中,当您将某些东西推入堆栈时,堆栈指针会被减去,因此堆栈会向下增长(到较小的地址)。就是这样。

答案 3 :(得分:2)

他们这样做的原因是因为堆栈与堆共享相同的内存块。堆从顶部(低地址)到底部(更高的地址编号)增长,而堆栈从底部(高地址编号)增长到顶部(更低的地址)。

这样做是为了不需要预测两次内存量(一个用于堆,另一个用于堆栈)。

00000000 HEAP----
00000001 ||||||||
00000002 vvvvvvvv

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

希望这有帮助。

答案 4 :(得分:1)

递减SP的原因很简单就是(*)将堆栈添加到“从底部”(关于内存位置)。如果你有一个“待办事项列表”就有点像。你可以在页面的顶部开始,而不是在列表中随机标记单个事物(就像我们通常那样),你只需要开始并完成页面下最远的工作。

使用堆栈顶部(即来自较高地址)的内存的原因是它允许另一个重要的内存存储,堆在另一个方向上增长(至少在某些情况下是这种情况)记忆模型)。继续使用“待办事项列表”类比,现在您还要从页面底部写下另一个列表,比如购物清单。但是,这个列表就是堆,当你走过商店时,你可以让自己在随机的地方擦掉它,以及重新使用一些擦除线留下的空间。

现在冒着为混淆添加更多材料的风险,堆栈管理的另一个重要元素是stack frame的概念,这是将参数存储到函数和局部变量的便捷方式,对应于嵌套函数调用的“整体上下文”。

(*)在许多CPU上,即。正如皮尔所指出的那样,有些CPU使用堆栈,当事情被推到SP上时,它会将SP“向上”移动(增加它)。

答案 5 :(得分:0)

堆栈增长,堆增长,这样你就不必决定每个堆多少。事实上,事情比现在更复杂,但是x86和其他人都有机器操作,内置了这个假设。无论如何,无关紧要,机器添加和减少同样好。

答案 6 :(得分:0)

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

这是一个数据结构。 “堆栈”类比是一个概念模型,它在内存空间中向上或向下增长的事实只是一个实现细节。哎呀,它使用连续的内存块只是一个实现细节;您可以很好地拥有一个堆栈,其中项目遍布各处,例如,如果您将其实现为链接列表。

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

实现堆栈需要的是:

  • 指向堆栈的每个框架/元素的方法
  • 一种指向堆栈最后插入元素的方法(又名堆栈顶部)
  • 一种获取上一个元素的方法
  • 将元素插入结尾/顶部的方法
  • 一种从结尾/顶部删除元素的方法,使其前一个元素成为新的最后一个/顶部元素。

内存布局的外观与其中任何内容无关。