Macros MASM
Mise à jour : novembre 2007
Pour simplifier l'utilisation des Pseudo-opérations brutes, vous disposez d'un jeu de macros, défini dans ksamd64.inc, qui peut être utilisé pour créer des prologues et des épilogues de procédures standard.
Notes
Macro |
Description |
---|---|
alloc_stack(n) |
Alloue un frame de pile de n octets (à l'aide de sub rsp, n) et émet les informations de déroulement appropriées (.allocstack n) |
save_reg reg, loc |
Enregistre un fichier .reg de registre non volatil sur la pile au niveau de l'emplacement de l'offset du RSP et informations de déroulement appropriées (.savereg reg, loc). |
push_reg reg |
Exécute un push d'un fichier .reg de registre non volatil sur la pile et émet les informations de déroulement appropriées (.pushreg reg). |
rex_push_reg reg |
Enregistre un registre non volatil sur la pile à l'aide d'un push à 2 octets et émet les informations de déroulement appropriées (.pushreg reg). Cela peut être utile si push est la première instruction dans la fonction à garantir que la fonction est corrigeable en mémoire. |
save_xmm128 reg, loc |
Enregistre un fichier .reg de registre XMM non volatil sur la pile au niveau de l'emplacement de l'offset du RSP compensez loc et émet les informations de déroulement appropriées (.savexmm128 reg, loc) |
set_frame reg, offset |
Définit le fichier .reg du registre du frame comme le RSP + l'offset (à l'aide de mov ou de lea) et émet les informations de déroulement appropriées (.set_frame reg, offset) |
push_eflags |
Exécute un push sur les eflags avec une instruction pushfq et émet les informations de déroulement appropriées (.alloc_stack 8) |
Voici un exemple de prologue de fonction avec une utilisation correcte des macros :
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