MASM マクロ

更新 : 2007 年 11 月

生の擬似演算 を簡単に使用できるように、ksamd64.inc に定義されたマクロ セットがあります。このマクロ セットを使用すると、一般的なプロシージャのプロローグとエピローグを作成できます。

解説

マクロ

説明

alloc_stack(n)

n バイトのスタック フレーム (sub rsp, n を使用する) を割り当て、適切なアンワインド情報を出力します (.allocstack n)。

save_reg reg, loc

スタック上の RSP オフセット位置に不揮発性レジスタ reg を保存し、適切なアンワインド情報を出力します (.savereg reg, loc)。

push_reg reg

スタック上に不揮発性レジスタ reg をプッシュし、適切なアンワインド情報を出力します (.pushreg reg)。

rex_push_reg reg

2 バイトのプッシュを使用してスタック上に不揮発性レジスタを保存し、適切なアンワインド情報を出力します (.pushreg reg)。関数が確実にホットパッチ可能になるようにプッシュを関数の最初の命令にしている場合、このマクロを使用する必要があります。

save_xmm128 reg, loc

スタック上の RSP オフセット位置に不揮発性 XMM レジスタ reg を保存し、適切なアンワインド情報を出力します (.savexmm128 reg, loc)。

set_frame reg, offset

RSP + オフセット (mov または lea を使用する) になるようにフレーム レジスタ reg を設定し、適切なアンワインド情報を出力します (.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 のアンワインド ヘルパー