.SETFRAME

Rellena el campo de registro del marco y el desplazamiento en la información de desenredado con el registro (reg) y el desplazamiento (offset) especificados. El desplazamiento debe ser un múltiplo de 16 y menor o igual que 240. Esta directiva también genera una entrada de código de desenredado UWOP_SET_FPREG para el registro especificado mediante el desplazamiento del prólogo actual.

Sintaxis

.SETFRAME reg, offset

Comentarios

Use .SETFRAME para especificar cómo se desenreda una función de marco. Solo se puede usar en el prólogo, que se extiende desde la PROCFRAME declaración a . Directiva ENDPROLOG . Estas directivas generan metadatos de desenredado (.xdata y .pdata secciones), pero no generan código ejecutable. Precede con .SETFRAME instrucciones que implementan las acciones que se van a desenlace. Para garantizar el acuerdo, encapsula las directivas de desenredado y el código que están diseñados para desenredar en una macro.

Ejemplo

Descripción

En el ejemplo siguiente se muestra cómo usar un puntero de marco:

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

Comportamiento de desenredado versión 3

Importante

La compatibilidad con Desenredado versión 3 es experimental y está sujeta a cambios. Habilite mediante ml64.exe /unwindv3.

En Desenredado versión 3, .SETFRAME emite una WOD_SET_FPREG entrada de código de desenredado para el registro especificado mediante el desplazamiento actual del prólogo. También rellena el campo de registro de fotogramas y el desplazamiento en la información de desenredado. El desplazamiento debe ser un múltiplo de 16 y menor o igual que 240.

Note

En Desenredar versión 1, las directivas vienen después de la instrucción . En Desenredado versión 3, las directivas vienen antes de la instrucción . .SETFRAME debe aparecer antes de la instrucción que describe. Este requisito es lo contrario a la versión 1, donde la directiva sigue la instrucción .

Ejemplo de desenredado3

; 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

El homólogo de epílogo es . UNSETFRAME.

Consulte también

x64 Desenredado versión 3 (experimental)
MASM para x64 (ml64.exe)
Referencia de directivas
Gramática BNF de MASM