.SETFRAME
指定したレジスタ (reg) とオフセット (offset) を使用して、フレーム レジスタ フィールドとオフセットをアンワインド情報に入力します。 オフセットは、240 以下の 16 の倍数にする必要があります。 このディレクティブは、現在のプロローグ オフセットを使用し、指定したレジスタの UWOP_SET_FPREG
アンワインド コード エントリも生成します。
構文
.SETFRAME reg, offset
解説
.SETFRAME は、フレーム関数をアンワインドする方法を ml64.exe ユーザーが指定できるようにします。これは、PROC FRAME 宣言から .ENDPROLOG ディレクティブまでのプロローグ内でのみ許可されています。 これらのディレクティブは、コードを生成するのではなく、.xdata
と .pdata
のみを生成します。 .SETFRAME は、アンワインドされるアクションを実際に実装する命令の後に指定する必要があります。 アンワインド ディレクティブと、これを使用してマクロでアンワインドすることが意図されているコードの両方をラップして、一致させるようにすることをお勧めします。
詳細については、「x64 用 MASM (ml64.exe)」を参照してください。
サンプル
説明
次の例は、フレーム ポインターを使用する方法を示しています。
コード
; 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