WOD_SET_FPREG使用尾声中的当前偏移量为指定的寄存器和偏移量生成展开代码条目。
Syntax
.UNSETFRAMEreg、 offset
参数
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