.UNSETFRAME

WOD_SET_FPREG使用尾声中的当前偏移量为指定的寄存器和偏移量生成展开代码条目。

Syntax

.UNSETFRAME regoffset

参数

reg
要取消设置的帧指针寄存器。

偏移
建立帧指针的堆栈帧的偏移量。

注解

Important

此指令是实验性的,可能会更改。 使用 ml64.exe /unwindv3. 启用展开版本 3。

.UNSETFRAME 仅在展开版本 3 中有效。 这是尾声的对应 。SETFRAME

.UNSETFRAME 仅允许在尾声区域中,介于 两者之间。BEGINEPILOG.ENDEPILOG。 这些指令生成展开元数据(.xdata.pdata 节),但不生成可执行代码。
在展开版本 3 中, .UNSETFRAME 必须出现在从帧指针寄存器还原堆栈指针的说明 之前
最好将展开指令和代码包装在宏中以确保协议。

在展开版本 3 中,尾声指令对于尾声展开代码生成是必需的。 没有一对就 .BEGINEPILOG/.ENDEPILOG 没有发出尾声展开代码。

注释

在展开版本 1 中,指令显示在相应的指令之后。 在展开版本 3 中,指令显示在指令 之前

展开 v3 的示例

; ml64 /unwindv3 frmex2.asm /link /entry:frmex2 /SUBSYSTEM:CONSOLE
_text SEGMENT
frmex2 PROC FRAME
   .pushreg rbp
   push rbp
   .allocstack 010h
   sub rsp, 010h
   .setframe rbp, 0
   mov rbp, rsp
.endprolog
   ; modify the stack pointer outside of the prologue (similar to alloca)
   sub rsp, 060h

   ; we can unwind from the following AV because of the frame pointer
   mov rax, 0
   mov rax, [rax] ; AV!

   add rsp, 060h
   .beginepilog
   .unsetframe rbp, 0
   mov rsp, rbp
   .freestack 010h
   add rsp, 010h
   .popreg rbp
   pop rbp
   .endepilog
   ret
frmex2 ENDP
_text ENDS
END

另请参阅

x64 展开版本 3 (实验性)
指令参考
.SETFRAME
.BEGINEPILOG
MASM BNF 语法