Makra MASM
W celu uproszczenia stosowania Pierwotne operacje Pseudo, istnieje zestaw makr, zdefiniowane w ksamd64.inc, który może służyć do tworzenia typowych czynności prologi i epilogues.
Uwagi
Makro |
Opis |
---|---|
alloc_stack(n) |
Przydziela ramki stosu n bajtów (przy użyciu sub rsp, n) i emituje odkręcanie odpowiednich informacji (.allocstack n) |
save_reg reg, loc |
Zapisuje reg nieulotna rejestru na stosie w loc przeciwstawne RSP i emituje odkręcanie odpowiednie informacje.(.savereg reg, loc) |
push_reg reg |
Odkłada reg nieulotna rejestru na stosie i emituje odkręcanie odpowiednie informacje.(.pushreg reg) |
rex_push_reg reg |
Zapisz nieulotna rejestr na stos za pomocą wypychania 2-bajtowego i emituje odpowiednich informacji (.pushreg reg) ta powinna być używana, jeśli kampania jest pierwszej instrukcji w funkcji w celu zapewnienia, że funkcja ta jest typu hot konfigurowalnym odkręcanie. |
save_xmm128 reg, loc |
Zapisuje reg nieulotnej z rejestru XMM na stosie w loc przeciwstawne RSP i emituje odkręcanie odpowiednie informacje (.savexmm128 reg, loc) |
set_frame reg, przesunięcie |
Ustawia reg rejestru ramki, aby być RSP + przesunięcie (używając mov to lub linie wio) i emituje odkręcanie odpowiednie informacje (.set_frame reg, przesunięcie) |
push_eflags |
Przesuwa eflags za pomocą instrukcji pushfq i emituje odkręcanie odpowiednich informacji (.alloc_stack 8) |
Oto prolog funkcja próbki z właściwy sposób użycia makr:
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