PROC

Marca o início e o fim de um bloco de procedimento chamado label. As instruções no bloco podem ser chamadas com a instrução CALL ou a diretiva INVOKE.

Sintaxe

labelPROCdistance⟧ ⟦language-type⟧ ⟦ PUBLIC | PRIVATE | EXPORT ⟧ ⟦<prologuearg>⟧ ⟦USESreglist⟧ ⟦,parameter:tag⟧ ...⟧
FRAME:ehandler-address⟧ ⟧
statements
labelENDP

Comentários

Os argumentos ⟦distance⟧ e ⟦language-type⟧ são válidos somente em MASM de 32 bits.

FRAME:ehandler-address⟧ ⟧ só é válido com ml64.exe e faz com que o MASM gere uma entrada de tabela de funções no .pdata e desenrole informações no .xdata para a exceção estruturada de uma função que manipula o comportamento de desenrolamento.

Quando o atributo FRAME é usado, ele deve ser seguido por uma diretiva .ENDPROLOG.

Confira MASM para x64 (ml64.exe) para obter mais informações sobre o uso de ml64.exe.

Exemplo

; ml64 ex1.asm /link /entry:Example1 /SUBSYSTEM:CONSOLE
_text SEGMENT
Example1 PROC FRAME
   push r10
.pushreg r10
   push r15
.pushreg r15
   push rbx
.pushreg rbx
   push rsi
.pushreg rsi
.endprolog
   ; rest of function ...
   ret
Example1 ENDP
_text ENDS
END

O código acima emitirá as seguintes informações de tabela de funções e desenrolamento:

FileHeader->Machine 34404
Dumping Unwind Information for file ex2.exe

.pdata entry 1 0x00001000 0x00001023

  Unwind data: 0x00002000

    Unwind version: 1
    Unwind Flags: None
    Size of prologue: 0x08
    Count of codes: 3
    Frame register: rbp
    Frame offset: 0x0
    Unwind codes:

      Code offset: 0x08, SET_FPREG, register=rbp, offset=0x00
      Code offset: 0x05, ALLOC_SMALL, size=0x10
      Code offset: 0x01, PUSH_NONVOL, register=rbp

Confira também

Referência das directivas
Gramática BNF do MASM