共用方式為


MASM 巨集

為了要簡化 未經處理的虛擬作業 的使用方式,ksamd64.inc 中定義了一組巨集,可以用來建立典型的程序初構 (Prologue) 和終解 (Epilogue)。

備註

巨集

說明

alloc_stack(n)

配置 n 個位元組的堆疊框架 (使用 sub rsp, n),並發出適當的回溯資訊 (.allocstack n)

save_reg reg, loc

將堆疊上的靜態 (Nonvolatile) 暫存器 reg 儲存到 RSP 位移 loc,並發出適當的回溯資訊 (.savereg reg, loc)

push_reg reg

推入堆疊上的靜態暫存器 reg,並發出適當的回溯資訊 (.pushreg reg)

rex_push_reg reg

使用 2 個位元組推入儲存堆疊上的靜態暫存器,並發出適當的回溯資訊 (.pushreg reg),當函式的第一個指令是推入時,您就必須這麼做,以確定函式可線上修補 (Hot-Patchable)。

save_xmm128 reg, loc

將堆疊上的靜態 XMM 暫存器 reg 儲存到 RSP 位移 loc,並發出適當的回溯資訊 (.savexmm128 reg, loc)

set_frame reg, offset

將框架暫存器 reg 設定為 RSP + 位移 (使用 mov 或 lea),並發出適當的回溯資訊 (.set_frame reg, offset)

push_eflags

使用 pushfq 指令推入 eflags,並發出適當的回溯資訊 (.alloc_stack 8)

以下是函式初構的範例,其中具有巨集的正確用法:

SkFrame struct 
Fill    dq ?; fill to 8 mod 16 
SavedRdi dq ?; saved register RDI 
SavedRsi dq ?; saved register RSI 
SkFrame ends

sampleFrame struct
Filldq?; fill to 8 mod 16
SavedRdidq?; Saved Register RDI 
SavedRsi  dq?; Saved Register RSI
sampleFrame ends

sample2 PROC FRAME
alloc_stack(sizeof sampleFrame)
save_reg rdi, sampleFrame.SavedRdi
save_reg rsi, sampleFrame.SavedRsi
.end_prolog

; function body

mov rsi, sampleFrame.SavedRsi[rsp]
mov rdi, sampleFrame.SavedRdi[rsp]

; Here’s the official epilog

add rsp, (sizeof sampleFrame)
ret
sample2 ENDP

請參閱

參考

MASM 的回溯 Helper