MASM-Makros
Aktualisiert: November 2007
Um die Verwendung von Unformatierte Pseudooperationen zu vereinfachen, stehen Makros zur Verfügung, die in ksamd64.inc definiert sind und zum Erstellen typischer Prologe und Epiloge für eine Prozedur verwendet werden können.
Hinweise
Makro |
Beschreibung |
---|---|
alloc_stack(n) |
Weist einen Stapelrahmen mit n Byte zu (unter Verwendung von sub rsp, n) und gibt die entsprechenden Entladeinformationen aus (.allocstack n). |
save_reg reg, loc |
Speichert ein nicht flüchtiges Register reg am RSP-Offset loc im Stapel und gibt die entsprechenden Entladeinformationen aus. (.savereg reg, loc) |
push_reg reg |
Verschiebt ein nicht flüchtiges Register reg in den Stapel und gibt die entsprechenden Entladeinformationen aus. (.pushreg reg) |
rex_push_reg reg |
Speichert ein nicht flüchtiges Register mit einem 2-Byte-push im Stapel und gibt die entsprechenden Entladeinformationen aus (.pushreg reg). Dies sollte verwendet werden, wenn die push-Anweisung die erste Anweisung in der Funktion ist, um sicherzustellen, dass die Funktion Hot Patch-fähig ist. |
save_xmm128 reg, loc |
Speichert ein nicht flüchtiges XMM-Register reg am RSP-Offset loc auf dem Stapel und gibt die entsprechenden Entladeinformationen aus (.savexmm128 reg, loc). |
set_frame reg, offset |
Legt das Frameregister reg auf RSP + offset fest (mit einer mov- oder lea-Anweisung) und gibt die entsprechenden Entladeinformationen aus (.set_frame reg, offset). |
push_eflags |
Verschiebt eflags mit einer pushfq-Anweisung und gibt die entsprechenden Entladeinformationen aus (.alloc_stack 8). |
Im Folgenden finden Sie einen Beispielfunktionsprolog mit richtiger Verwendung der Makros:
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