UWOP_SAVE_NONVOL使用目前的序言位移,為指定的緩存器 (regUWOP_SAVE_NONVOL_FARoffset) 產生 或 回溯程式代碼專案。 Microsoft 組合語言器(MASM)會選擇最有效率的編碼方式。
語法
.SAVEREGreg,偏移
備註
用 .SAVEREG 來 ml64.exe 指定框架函數如何展開。 你只能在序章中使用,序 PROCFRAME 章從宣告延伸到 。ENDPROLOG 指令。
- 這些指令會產生解開的元資料(
.xdata和.pdata區段),但不會產生可執行程式碼。 - 在前端說明
.SAVEREG實際執行要展開的動作。 - 為了確保一致,將解碼指令和它們要解開的程式碼都包裝成一個巨集。
Unwind 版本 3 的行為
Important
Unwind 版本 3 的支援仍屬實驗性質,可能會有所變動。 啟用時可使用 ml64.exe /unwindv3。
在 Unwind 版本 3 中,會 .SAVEREG 輸出 a WOD_SAVE_NONVOL 或 WOD_SAVE_NONVOL_FAR unwind 代碼。 MASM 根據 偏移量大小選擇最有效率的編碼:
| 解纏程式碼 | 狀況 |
|---|---|
WOD_SAVE_NONVOL |
偏移 量可編碼為縮放的 16 位元值 |
WOD_SAVE_NONVOL_FAR |
偏移 量需要完整的 32 位元值 |
備註
在 Unwind 版本 1 中,指令會出現在對應指令之後。 在 Unwind 版本 3 中,指令出現 在指令之前 。
.SAVEREG 必須 出現在其 描述的指令之前。 此要求與版本 1 相反,版本 1 指令是跟隨指令。
unwindv3 範例
; 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
後記對應者為 。RESTORE的。
另請參閱
x64 Unwind 版本 3(實驗性)
指示詞參考
適用於 x64 的 MASM (ml64.exe)
MASM BNF 文法