.ALLOCSTACK

.ALLOCSTACK genera un UWOP_ALLOC_SMALL o un UWOP_ALLOC_LARGE con el tamaño especificado para el desplazamiento actual en el prólogo.

Sintaxis

.ALLOCSTACK tamaño

Comentarios

Microsoft Ensamblador (MASM) elige la codificación más eficaz para un tamaño determinado.

.ALLOCSTACK permite ml64.exe a los usuarios especificar cómo se desenreda una función de marco y solo se permite dentro del prólogo, que se extiende desde la declaración PROCFRAME a . Directiva ENDPROLOG .

  • Estas directivas generan metadatos de desenredado (.xdata y .pdata secciones), pero no generan código ejecutable.
  • Precede con .ALLOCSTACK las instrucciones que realmente implementan las acciones que se van a desenlazar. Encapsula las directivas de desenredado y el código que están diseñados para desenredar en una macro para garantizar el acuerdo.

El operando tamaño debe ser un múltiplo de 8.

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

Ejemplo: especificar un controlador de desenredado o excepción de desenredado versión 3

En el ejemplo siguiente se muestra cómo especificar un controlador de excepciones/desenredado:

; ml64 ex3.asm /link /entry:Example3 /SUBSYSTEM:Console
text SEGMENT
PUBLIC Example3
PUBLIC Example3_UW
Example3_UW PROC
   ; exception/unwind handler body

   ret 0

Example3_UW ENDP

Example3 PROC FRAME : Example3_UW

   sub rsp, 16
.allocstack 16

.endprolog

   ; function body
    add rsp, 16
   ret 0

Example3 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.

.ALLOCSTACK genera una WOD_ALLOC_SMALLentrada de código de desenredado , WOD_ALLOC_LARGEo WOD_ALLOC_HUGE Desenredado versión 3 con el tamaño especificado para el desplazamiento actual en el prólogo.

.ALLOCSTACK debe aparecer antes de la sub rsp, N instrucción que describe. Este requisito es lo contrario a la versión 1, donde la directiva sigue la instrucción .

MASM emite uno de los tres códigos de desenredado en función del tamaño de asignación:

Código de desenredado Condition
WOD_ALLOC_SMALL tamaño ≤ 128 bytes
WOD_ALLOC_LARGE tamaño ≤ 32 KB
WOD_ALLOC_HUGE tamaño> 32 KB

La versión 1 solo UWOP_ALLOC_SMALL genera o UWOP_ALLOC_LARGE. La versión 3 agrega una tercera variante, WOD_ALLOC_HUGE, para las asignaciones de más de 32 KB.

Note

En Desenredar versión 1, la directiva aparece después de la instrucción correspondiente. En Desenredar versión 3, la directiva aparece antes de la instrucción .

Ejemplo de desenredado3

; ml64 ex3.asm /unwindv3 /link /entry:Example3 /SUBSYSTEM:Console
text SEGMENT
PUBLIC Example3
PUBLIC Example3_UW
Example3_UW PROC
   ; exception/unwind handler body

   ret 0

Example3_UW ENDP

Example3 PROC FRAME : Example3_UW

.allocstack 16
   sub rsp, 16

.endprolog

   ; function body
    add rsp, 16
   ret 0

Example3 ENDP
text ENDS
END

Consulte también

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