使用当前序言偏移为指定的寄存器 (reg) 和偏移(offset)生成 UWOP_SAVE_NONVOL 或 UWOP_SAVE_NONVOL_FAR 展开代码条目。 Microsoft汇编程序(MASM)选择最有效的编码。
语法
.SAVEREGreg,offset
注解
用于.SAVEREGml64.exe指定帧函数展开的方式。 只能在序幕中使用,该序幕从 PROCFRAME 声明扩展到 .ENDPROLOG 指令。
- 这些指令生成展开元数据(
.xdata和.pdata节),但不生成可执行代码。 - 在
.SAVEREG前面提供实际实现要撤消的操作的说明。 - 为了确保协议,请包装展开指令及其要在宏中展开的代码。
展开版本 3 行为
Important
展开版本 3 支持是实验性的,可能会更改。 使用 ml64.exe /unwindv3.
在展开版本 3 中, .SAVEREG 发出一个 WOD_SAVE_NONVOL 或一个 WOD_SAVE_NONVOL_FAR 展开代码条目。 MASM 根据 偏移量大小选择最有效的编码:
| 展开代码 | 条件 |
|---|---|
WOD_SAVE_NONVOL |
偏移 量可以编码为缩放的 16 位值 |
WOD_SAVE_NONVOL_FAR |
偏移 需要完整的 32 位值 |
注释
在展开版本 1 中,指令显示在相应的指令之后。 在展开版本 3 中,指令显示在指令 之前 。
.SAVEREG 必须显示在它描述的说明 之前 。 此要求与版本 1 相反,其中指令遵循指令。
展开 v3 的示例
; ml64 /unwindv3 ex1.asm /link /entry:Example1 /SUBSYSTEM:CONSOLE
_text SEGMENT
Example1 PROC FRAME
.allocstack 020h
sub rsp, 020h
.savereg rbx, 0
mov [rsp], rbx
.savereg rsi, 8
mov [rsp+8], rsi
.endprolog
; rest of function ...
mov rsi, [rsp+8]
mov rbx, [rsp]
add rsp, 020h
ret
Example1 ENDP
_text ENDS
END
尾声对应项 。RESTOREREG。