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

.STACK is not allocating the correct size in MASM

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

When used with .MODEL, defines a stack segment (with segment name STACK). The optional size specifies the number of bytes for the stack (default 1,024). The .STACK directive automatically closes the stack statement. (32-bit MASM only.)

为了实验,我把.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).

为什么???

不管文档怎么说,.STACK 指令在创建 32 位 PECOFF 目标文件时没有任何用处。它所做的只是创建一个名为 STACK 的空部分,而不考虑给定的大小。该指令仅用于创建 16 位代码。

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