지정된 레지스터(reg) 및 오프셋(오프셋)을 사용하여 프레임 레지스터 필드와 해제 정보의 오프셋을 채웁니다. 오프셋은 16의 배수여야 하며 240보다 작거나 같아야 합니다. 또한 이 지시문은 UWOP_SET_FPREG 현재 프롤로그 오프셋을 사용하여 지정된 레지스터에 대한 해제 코드 항목을 생성합니다.
구문
.SETFRAMEreg, offset
설명
프레임 함수의 해제 방법을 지정하는 데 사용합니다 .SETFRAME . 선언에서 PROCFRAME 확장되는 프롤로그 내에서만 사용할 수 있습니다 . ENDPROLOG 지시문입니다. 이러한 지시문은 해제 메타데이터(.xdata 및 .pdata 섹션)를 생성하지만 실행 코드를 생성하지는 않습니다.
.SETFRAME 해제할 작업을 구현하는 지침이 앞에 섰습니다. 규약을 보장하려면 해제 지시문과 매크로에서 해제하려는 코드를 모두 래핑합니다.
샘플
설명
다음 샘플에서는 프레임 포인터를 사용하는 방법을 보여 줍니다.
코드
; 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
버전 3 해제 동작
Important
해제 버전 3 지원은 실험적이며 변경될 수 있습니다. 를 사용하여 ml64.exe /unwindv3사용하도록 설정합니다.
해제 버전 3 .SETFRAME 에서 현재 프롤로그 오프셋을 사용하여 지정된 레지스터에 대한 해제 코드 항목을 내보 WOD_SET_FPREG 낸다. 또한 프레임 레지스터 필드를 채우고 해제 정보의 오프셋도 채웁니다.
오프셋은 16의 배수이고 240보다 작거나 같아야 합니다.
Note
Unwind 버전 1에서 지시문은 명령 후에 제공됩니다. Unwind 버전 3에서 지시문은 명령 앞에 옵니다.
.SETFRAME 은 설명한 명령 앞에 나타나야 합니다. 이 요구 사항은 지시문이 지침을 따르는 버전 1과 반대입니다.
unwindv3의 예
; 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
에필로그 대응입니다 . UNSETFRAME.