. SETFRAME

Fyller i fältet för ramregister och förskjuter informationen med hjälp av det angivna registret (reg) och förskjutningen (offset). Förskjutningen måste vara en multipel av 16 och mindre än eller lika med 240. Det här direktivet genererar också en UWOP_SET_FPREG avspolningskodpost för det angivna registret med den aktuella prologförskjutningen.

Syntax

.SETFRAME reg, offset

Anmärkningar

Använd .SETFRAME för att ange hur en ramfunktion avspolas. Du kan bara använda den i prologen, som sträcker sig från deklarationen PROCFRAME till . ENDPROLOG-direktivet . Dessa direktiv genererar varva ned metadata (.xdata och .pdata avsnitt) men producerar inte körbar kod. Föregå .SETFRAME med instruktioner som implementerar de åtgärder som ska ångras. För att säkerställa en överenskommelse omsluter du både avaktiveringsdirektiven och den kod som de är avsedda att varva ned i ett makro.

Exempel

Description

Följande exempel visar hur du använder en bildrutepekare:

Kod

; 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

Varva ned version 3-beteende

Important

Stöd för att varva ned version 3 är experimentellt och kan komma att ändras. Aktivera det med hjälp ml64.exe /unwindv3av .

I Varva ned version 3 .SETFRAME avger du en WOD_SET_FPREG avspolningskodpost för det angivna registret med den aktuella prologförskjutningen. Den fyller också i fältet för ramregistrering och förskjuter informationen. Förskjutningen måste vara en multipel av 16 och mindre än eller lika med 240.

Note

I Varva ned version 1 kommer direktiven efter instruktionen. I Varva ned version 3 kommer direktiven före instruktionen. .SETFRAME måste visas före instruktionen som beskrivs. Detta krav är motsatsen till version 1, där direktivet följer instruktionen.

Exempel på avspolning 3

; 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

Motsvarigheten till epilogen är . UNSETFRAME.

Se även

x64 Varva ned version 3 (experimentell)
MASM för x64 (ml64.exe)
Referens för direktiv
MASM BNF-grammatik