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

问题描述 投票:3回答:1

基于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)

为什么?

assembly masm callstack
1个回答
3
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.