PROC

label と呼ばれるプロシージャ ブロックの先頭と末尾をマークします。 ブロック内のステートメントは、CALL 命令、または INVOKE ディレクティブで呼び出すことができます。

構文

label PROCdistance⟧ ⟦language-type⟧ ⟦ PUBLIC | PRIVATE | EXPORT ⟧ ⟧⟣<prologuearg>⟧ ⟦USES reglist⟧ ⟦, parameter:tag⟧ ...⟧
FRAME:ehandler-address⟧ ⟧
statements
label ENDP

解説

distance⟧ 引数と ⟦language-type⟧ 引数は、32 ビット MASM でのみ有効です。

FRAME:ehandler-address⟧ ⟧ は、ml64.exe でのみ有効です。これを使用すると、関数の構造化例外処理のアンワインド動作に対して、MASM から .pdata に関数テーブル エントリが生成され、.xdata にアンワインド情報が生成されます。

FRAME 属性を使用する場合は、.ENDPROLOG ディレクティブが後に続くように指定する必要があります。

ml64.exe の使用方法に関する詳細については、「x64 用 MASM (ml64.exe)」を参照してください。

; 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

上記のコートによって、次の関数テーブルとアンワインド情報が出力されます。

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

関連項目

ディレクティブ リファレンス
MASM BNF 文法