.SETFRAME

Inserisce il campo registro frame e l'offset nelle informazioni di rimozione utilizzando il registro (reg) e l'offset specificati (offset). L'offset deve essere un multiplo di 16 e minore o uguale a 240. Questa direttiva genera anche una UWOP_SET_FPREG voce di codice di rimozione per il registro specificato utilizzando l'offset del prologo corrente.

Sintassi

.SETFRAME reg, offset

Osservazioni:

Usare .SETFRAME per specificare la modalità di rimozione di una funzione frame. È possibile usarlo solo all'interno del prologo, che si estende dalla PROCFRAME dichiarazione all'oggetto . Direttiva ENDPROLOG . Queste direttive generano metadati di rimozione (.xdata e .pdata sezioni) ma non producono codice eseguibile. Precedere .SETFRAME le istruzioni che implementano le azioni da rimuovere. Per garantire il contratto, eseguire il wrapping di entrambe le direttive di rimozione e il codice da rimuovere in una macro.

Esempio

Descrizione

L'esempio seguente illustra come usare un puntatore a fotogrammi:

Codice

; ml64 frmex2.asm /link /entry:frmex2 /SUBSYSTEM:CONSOLE
_text SEGMENT
frmex2 PROC FRAME
   push rbp
.pushreg rbp
   sub rsp, 010h
.allocstack 010h
   mov rbp, rsp
.setframe rbp, 0
.endprolog
   ; modify the stack pointer outside of the prologue (similar to alloca)
   sub rsp, 060h

   ; we can unwind from the following AV because of the frame pointer
   mov rax, 0
   mov rax, [rax] ; AV!

   add rsp, 060h
   add rsp, 010h
   pop rbp
   ret
frmex2 ENDP
_text ENDS
END

Comportamento di rimozione versione 3

Importante

Il supporto della versione 3 della rimozione è sperimentale ed è soggetto a modifiche. Abilitarlo usando ml64.exe /unwindv3.

In Rimozione versione 3 .SETFRAME genera una WOD_SET_FPREG voce di codice di rimozione per il registro specificato usando l'offset del prologo corrente. Compila anche il campo registro frame e l'offset nelle informazioni di rimozione. L'offset deve essere un multiplo di 16 e minore o uguale a 240.

Note

In Rimozione versione 1 le direttive vengono fornite dopo l'istruzione . In Rimozione versione 3, le direttive vengono prima dell'istruzione. .SETFRAME deve essere visualizzato prima dell'istruzione descritta. Questo requisito è l'opposto della versione 1, in cui la direttiva segue l'istruzione .

Esempio di rimozionev3

; ml64 /unwindv3 frmex2.asm /link /entry:frmex2 /SUBSYSTEM:CONSOLE
_text SEGMENT
frmex2 PROC FRAME
   .pushreg rbp
   push rbp
   .allocstack 010h
   sub rsp, 010h
   .setframe rbp, 0
   mov rbp, rsp
.endprolog
   ; modify the stack pointer outside of the prologue (similar to alloca)
   sub rsp, 060h

   ; we can unwind from the following AV because of the frame pointer
   mov rax, 0
   mov rax, [rax] ; AV!

   add rsp, 060h
   add rsp, 010h
   pop rbp
   ret
frmex2 ENDP
_text ENDS
END

La controparte dell'epilogo è . UNSETFRAME.

Vedi anche

Versione di rimozione x64 3 (sperimentale)
MASM per x64 (ml64.exe)
Riferimento alle direttive
Grammatica BNF MASM