MASM マクロ
生の擬似演算 を簡単に使用できるように、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