Assembly .堆栈未在MASM中分配正确的大小
基于,可以使用.STACK指令 与.MODEL一起使用时,定义堆栈段(段名为stack)。可选大小指定堆栈的字节数(默认为1024)。.STACK指令自动关闭STACK语句。(仅限32位MASM。) 为了进行实验,我制作了Assembly .堆栈未在MASM中分配正确的大小,assembly,masm,callstack,Assembly,Masm,Callstack,基于,可以使用.STACK指令 与.MODEL一起使用时,定义堆栈段(段名为stack)。可选大小指定堆栈的字节数(默认为1024)。.STACK指令自动关闭STACK语句。(仅限32位MASM。) 为了进行实验,我制作了.STACK来分配1073741824字节(1GB) 注意,我正在Visual Studio 2013控制台项目中运行代码。 .586 .MODEL FLAT .STACK 1073741824 .DATA a DWORD 50 b DWORD 55 .CODE mai
.STACK
来分配1073741824字节(1GB)
注意,我正在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字节(~1MB)
为什么?不管文档怎么说,.STACK指令在创建32位PECOFF对象文件时没有任何用处。它所做的只是创建一个名为STACK的空节,而不管给定的大小如何。本指令仅在创建16位代码时使用
您可以使用链接器选项代替.STACK指令。您应该能够从项目的属性页->链接器->系统->堆栈保留大小的Visual Studio IDE中设置此选项。在32位模式下,无论您做什么,可能都没有足够的连续可用地址空间来拥有1G堆栈。在32位平面内存模式中,堆栈是在程序开始运行之前由OS加载程序创建的。它的大小是a,默认为。堆栈的具体用途是什么???