Macro MASM

Per semplificare l'utilizzo delle Pseudo operazioni in modalità raw, è disponibile un set di macro, definite in ksamd64.inc, che possono essere utilizzate per creare tipici prologhi ed epiloghi delle routine.

Note

Macro

Descrizione

alloc_stack(n)

Alloca uno stack frame di n byte (mediante un'istruzione sub rsp, n), quindi genera le informazioni di rimozione appropriate (.allocstack n).

save_reg reg, loc

Salva il registro non volatile reg nello stack in corrispondenza dell'offset RSP loc, quindi genera le informazioni di rimozione appropriate(.savereg reg, loc).

push_reg reg

Inserisce il registro non volatile reg nello stack, quindi genera le informazioni di rimozione appropriate(.pushreg reg).

rex_push_reg reg

Salvare un registro non volatile nello stack utilizzando un incremento di 2 byte e genera invece opportuno rimuovere le informazioni nel registro di .pushreg) che questo deve essere utilizzato se la push è la prima istruzione nella funzione assicurarsi che la funzione è calda - patchable.

save_xmm128 reg, loc

Salva il registro XMM non volatile reg nello stack in corrispondenza dell'offset RSP loc, quindi genera le informazioni di rimozione appropriate (.savexmm128 reg, loc).

set_frame reg, offset

Imposta il frame register reg in modo che corrisponda a RSP + offset (mediante un'istruzione mov o lea), quindi genera le informazioni di rimozione appropriate (.set_frame reg, offset).

push_eflags

Inserisce il contenuto del registro EFLAGS (mediante un'istruzione pushfq), quindi genera le informazioni di rimozione appropriate (.alloc_stack 8).

Di seguito è riportato un esempio di prologo di funzione, in cui è illustrato l'utilizzo corretto delle macro:

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

Vedere anche

Riferimenti

Helper di rimozione per MASM