生成 具有尾声中当前偏移量指定大小的WOD_ALLOC_SMALL、 WOD_ALLOC_LARGE或 WOD_ALLOC_HUGE 展开代码项。
Syntax
。FREESTACK大小
参数
大小
要从堆栈中解除分配的字节数。 必须是 8 的倍数。
注解
Important
此指令是实验性的,可能会更改。
使用 ml64.exe /unwindv3.. 启用展开版本 3。
- 可以使用 。 仅展开版本 3 中的 FREESTACK。 这是尾声的对应 。ALLOCSTACK。
- 可以使用 。FREESTACK 仅在尾声区域中,介于 两者之间。BEGINEPILOG 和 .ENDEPILOG。
- 在展开版本 3 中。FREESTACK 必须出现在实现堆栈解除分配的指令之前
add rsp, N。 - 为了确保协议,请包装展开指令及其要在宏中展开的代码。
- 这些指令生成展开元数据(
.xdata和.pdata节),但不生成可执行代码。 - Microsoft汇编程序(MASM)为给定大小选择最有效的编码。
MASM 根据大小发出三个展开代码之一:
| 展开代码 | 条件 |
|---|---|
WOD_ALLOC_SMALL |
大小 ≤ 128 字节 |
WOD_ALLOC_LARGE |
大小 ≤ 32 KB |
WOD_ALLOC_HUGE |
大小> 32 KB |
在展开版本 3 中,尾声指令对于尾声展开代码生成是必需的。 在没有对的情况下 .BEGINEPILOG/.ENDEPILOG ,汇编程序不会发出尾声展开代码。
注释
在展开版本 1 中,指令显示在相应的指令之后。 在展开版本 3 中,指令显示在指令 之前 。
展开 v3 的示例
; ml64 /unwindv3 ex1.asm /link /entry:Example1 /SUBSYSTEM:CONSOLE
_text SEGMENT
Example1 PROC FRAME
.allocstack 16
sub rsp, 16
.endprolog
; function body
.beginepilog
.freestack 16
add rsp, 16
.endepilog
ret
Example1 ENDP
_text ENDS
END