Macros MASM

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

Voir aussi

Référence

Déroulement de l'assistance pour MASM