.STACK 没有在 MASM 中分配正确的大小

Posted

技术标签:

【中文标题】.STACK 没有在 MASM 中分配正确的大小【英文标题】:.STACK is not allocating the correct size in MASM 【发布时间】:2020-04-20 05:36:48 【问题描述】:

基于Microsoft MASM Documentation,.STACK指令的用法是

当与 .MODEL 一起使用时,定义一个堆栈段(段名为 STACK)。可选大小指定堆栈的字节数(默认为 1,024)。 .STACK 指令自动关闭堆栈语句。 (仅限 32 位 MASM。)

为了实验,我做了.STACK分配1,073,741,824 bytes (1 GB)

请注意,我在 Visual Studio 2013 控制台项目中运行代码。

.586

.MODEL FLAT

.STACK 1073741824

.DATA
a DWORD 50
b DWORD 55

.CODE
main PROC
    addLoop: mov eax, a
    push eax
    mov eax, 0
    mov ebx, b
    push ebx
    jmp addLoop
    RET
main ENDP

END

代码会溢出堆栈。我所做的是记下ESP 寄存器的第一个地址,让代码运行直到溢出,然后从第一个地址中减去最后的ESP 以获得堆栈的大小。

在我的上下文中,它是00DAFEE4 - 00CB3000 + 1 = 000FCEE5。只有1036005 bytes (~1 MB)

为什么???

【问题讨论】:

在 32 位模式下,无论您做什么,都可能没有足够的连续可用地址空间来拥有 1G 堆栈。 在 32 位平面内存模型中,堆栈是由 OS 加载程序在程序开始运行之前创建的。它的大小是linker option,默认为one megabyte。 .STACK到底有什么用??? 【参考方案1】:

尽管文档说了什么,.STACK 指令在创建 32 位 PECOFF 对象文件时没有做任何有用的事情。它所做的只是创建一个名为 STACK 的空部分,而不管给定的大小。该指令仅在创建 16 位代码时使用。

您可以使用/STACK 链接器选项代替使用.STACK 指令。您应该能够在 Visual Studio IDE 中从项目的属性页 -> 链接器 -> 系统 -> 堆栈保留大小设置此选项。

【讨论】:

以上是关于.STACK 没有在 MASM 中分配正确的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中分配类内数组的可修改大小

将(很多!)数字转换为字符串的正确方法,无需在 Qt 中分配

在结构中分配内存时出现不可预测的行为

有没有办法在 SKSpriteNode 中分配和调用变量?

如何使用java代码在sp值中分配文本大小

只有 EAX 的低半部分归零? (MASM 使用 .486 / .model flat,stdcall)