Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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