. QUADRO DEFINIDO

Preenche o campo de registos de trama e o deslocamento na informação de desenrolar usando o registo (reg) e o offset (offset) especificados. O desvio deve ser um múltiplo de 16 e menor ou igual a 240. Esta diretiva também gera uma UWOP_SET_FPREG entrada de código de desmantelamento para o registo especificado usando o deslocamento prólogo atual.

Syntax

.SETFRAME regulador, deslocamento

Remarks

Use .SETFRAME para especificar como uma função de frame se desenrola. Só pode usá-lo dentro do prólogo, que se estende da PROCFRAME declaração até ao . Diretiva ENDPROLOG . Estas diretivas geram metadados de desmantelamento (.xdata e .pdata secções), mas não produzem código executável. Preceda .SETFRAME com instruções que implementam as ações a desenrolar. Para garantir o acordo, envolve tanto as diretivas de desmantelamento como o código que devem desfazer numa macro.

Exemplo

Description

O exemplo seguinte mostra como usar um ponteiro de frame:

Código

; 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 do Unwind Versão 3

Importante

O suporte ao Unwind Versão 3 é experimental e está sujeito a alterações. Ative-o usando ml64.exe /unwindv3.

No Unwind Versão 3, .SETFRAME emite uma WOD_SET_FPREG entrada de código de unwind para o registo especificado usando o deslocamento do prólogo atual. Também preenche o campo do registo de frames e o deslocamento na informação de desenrolar. O deslocamento deve ser múltiplo de 16 e menor ou igual a 240.

Note

No Unwind Versão 1, as diretivas surgem após a instrução. No Unwind Versão 3, as diretivas surgem antes da instrução. .SETFRAME deve aparecer antes da instrução que descreve. Este requisito é o oposto da Versão 1, onde a diretiva segue a instrução.

Exemplo para unwindv3

; 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

A contraparte do epílogo é . UNSETFRAME.

Ver também

x64 Unwind Versão 3 (experimental)
MASM para x64 (ml64.exe)
Referência das diretivas
MASM BNF Gramática