【发布时间】:2013-01-30 14:10:50
【问题描述】:
首先,我将展示对堆栈的了解不足,然后我将提出一个无法很好回答的略微连贯的问题,因为该问题不够具体,无法引出一个有条理的问题回答。
那么,当程序运行时,函数被压入堆栈——这意味着堆栈指针是递增还是递减?
堆栈内存分配中究竟存储了什么?指向变量数据的指针,指向程序 est 的指针?我只是不明白堆栈中到底存储了什么(什么数据类型,什么类型的引用,它们是如何存储的)我希望一个函数存储它的局部变量指针和一个指向调用它的地址的指针,以便它可以返回.
此外,windows x86 虚拟内存分配实际上将单个虚拟内存块映射到任意多个物理内存地址,因此堆栈在 windows x86 系统的物理内存中是连续的还是不连续的?
最后,假设堆栈存储在 x86 上的 32 位窗口上的应用程序的用户分配的虚拟内存中,堆栈指针(引用高或低内存地址?)是 31 位(31 因为用户分配和高 2GB 保留给内核分配)小端引用,对吧?
当数据到达堆栈时(例如进入一个函数并为新的 DWORD 分配内存)存储在该 DWORD 中的数据被推入堆栈并且堆栈指针是递增还是递减?系统如何同时感知堆栈的两端?
----这里的ESP?
|-变量x的引用地址
|-函数1中变量x的内存地址要存储的整数数据
|----上面的函数1块^^
|
|
---- OR ESP HERE?
并且从这里引用地址和整数数据将被弹出到寄存器中,并且一个 mov 操作会将整数数据存储在分配的内存位置?
当新数据进入堆栈时,我听说堆栈“向下”增长,但这似乎不合理,因为只有更高和更低的内存地址 - 我知道只有堆栈的一端需要递增/递减,但它是高地址还是低地址,堆栈长度(高度)如何分隔?当堆栈“增长”过大时,系统如何理解?
抱歉所有问题,但我读了很多书,用于描述我一直在读的概念的术语在我的词汇表中没有很好地操作。此外,我在 google、wikipedia 和这个网站上进行了一些检查,但找不到解决我特定问题的解释。
谢谢。
【问题讨论】:
-
你读完了Wikipedia article吗?它有一个相当彻底的治疗。您的大多数问题都归结为实施细节;堆栈是一种抽象,一种数据结构,您可以有效地使用它而无需考虑其内部实现。
-
搜索“[assembly] stack”、“[x86] stack”或类似的。例如:stackoverflow.com/questions/13173162/…
标签: windows memory-management assembly operating-system stack