.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 设置此选项 -> 链接器 -> 系统 -> 堆栈保留大小。
基于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 设置此选项 -> 链接器 -> 系统 -> 堆栈保留大小。