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