Windows汇编堆栈和堆栈?

操作系统:Windows 7 32位

所以在像C ++一样有一个和一个堆栈。 但最近我开始了一些程序集学习,没有看到任何类似的东西,只是一堆,但看起来像纯粹的内存。 那么,针对c ++和其他语言的堆栈和堆栈实现是特定的吗? 还是你仍然得到一个堆和堆栈分配? 当启动一个可执行文件时,windows为进程分配内存方面做了什么? 一个stream程如何知道堆栈大小需要多大?

最近怎么样

编辑:也许有人可以提供一个链接如何堆和堆栈内存处理由CPU / OS的过程

Solutions Collecting From Web of "Windows汇编堆栈和堆栈?"

堆栈主要由CPU来维护(PUSH / POP / CALL / RET命令)。 堆是纯粹的OS /运行时库功能。 因此堆栈访问是自然的组装。 对于堆访问,您只需从汇编代码(HeapAlloc / HeapFree或其他库)中调用相关的API即可。 与堆栈不同,汇编语言中没有用于堆内存管理的低级原语。

您不必担心Windows上的堆栈大小。 随着你越来越多地使用它,它将会变得透明。 在低级别方面,Windows在堆栈底部下方建立一个守卫内存页面(假设堆栈增长缓慢)。 当您的堆栈到达警戒页面时,会在CPU中生成访问冲突异常。 Windows内核会抓住它,注意到情况,并增加堆栈。

我的大部分知识不是Windows专有的,所以请耐心等待:

堆和堆栈是指内存中的不同区域(但在每种情况下我们仍在讨论主内存)。 这不是特定于任何语言。 堆居于低内存地址并向上增长; 堆栈居住在高内存地址并向下增长。 这是为了防止它们重叠(这将是非常糟糕的)。

在32位架构上,EBP和ESP寄存器跟踪当前的堆栈帧。 EBP是基指针 – 它指向当前栈帧的高地址。 ESP是堆栈指针,它指向当前堆栈帧的低地址。

请记住,空闲/分配堆和堆栈内存的概念在应用程序级别上是相关的。 在机器级别,所有内存看起来都是一样的 – 由编程人员(或编译器)来跟踪哪些内存段正在使用。

该堆栈由以下各项组合管理:调用函数的指令以及对EBP和ESP的显式修改。 任何低于ESP的东西都被认为是释放的。 所以释放内存你可以添加到ESP。

堆由内存分配方法管理; 文档可以在这里找到。 我不确定Winows的具体情况,但通常会有一些内存管理器负责确保没有将内存块分配给多个应用程序。