Macro MASM

Aggiornamento: novembre 2007

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

Salva un registro non volatile nello stack (mediante un inserimento a 2 byte), quindi genera le informazioni di rimozione appropriate (.pushreg reg). Affinché alla funzione possa essere applicata una hot patch, questa istruzione deve essere utilizzata solo se l'inserimento corrisponde alla prima istruzione nella funzione.

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