원시 의사 작업
이 항목에서는 의사 작업에 대해 설명합니다.
설명
의사 작업 |
설명 |
---|---|
PROC FRAME [:ehandler] |
MASM으로 .pdata에서 함수 테이블 엔트리를 생성하고 함수의 구조적 예외 처리 해제 동작을 위해 .xdata에서 정보를 해제합니다.ehandler가 있으면 이 프로시저가 언어별 처리기로 .xdata에 입력됩니다. FRAME 특성을 사용할 때는 이 특성 뒤에 .ENDPROLOG 지시문을 함께 사용해야 합니다.함수가 리프 함수(함수 형식 참조)이면 FRAME 특성이 필요 없습니다. 이는 다른 의사 작업의 경우에도 마찬가지입니다. |
.PUSHREG reg |
프롤로그의 현재 오프셋을 사용하여 지정된 레지스터 번호에 대한 UWOP_PUSH_NONVOL 해제 코드 엔트리를 생성합니다. 이는 비volatile 정수 레지스터와 함께 사용해야 합니다.volatile 레지스터를 푸시하려면 .ALLOCSTACK 8을 대신 사용해야 합니다. |
.SETFRAME reg, offset |
지정된 레지스터와 오프셋을 사용하여 해제 정보의 프레임 레지스터 필드와 오프셋을 입력합니다.오프셋은 16의 배수여야 하고 240보다 작거나 같아야 합니다.이 지시문은 현재 프롤로그 오프셋을 사용하여 지정된 레지스터에 대한 UWOP_SET_FPREG 해제 코드 항목도 생성합니다. |
.ALLOCSTACK size |
프롤로그의 현재 오프셋에 대해 지정된 크기를 사용하여 UWOP_ALLOC_SMALL 또는 UWOP_ALLOC_LARGE를 생성합니다. size 피연산자는 8의 배수여야 합니다. |
.SAVEREG reg, offset |
현재 프롤로그 오프셋을 사용하여 지정된 레지스터 및 오프셋에 대해 UWOP_SAVE_NONVOL 또는 UWOP_SAVE_NONVOL_FAR 해제 코드 엔트리를 생성합니다.MASM은 가장 효율적인 인코딩을 선택합니다. 오프셋은 8의 배수인 양수여야 합니다.오프셋은 프로시저의 프레임을 기준으로 합니다. 이 프레임은 일반적으로 RSP에 있거나 프레임 포인터를 사용하는 경우 배율 조정되지 않은 프레임 포인터입니다. |
.SAVEXMM128 reg, offset |
현재 프롤로그 오프셋을 사용하여 지정된 XMM 레지스터 및 오프셋에 대해 UWOP_SAVE_XMM128 또는 UWOP_SAVE_XMM128_FAR 해제 코드 엔트리를 생성합니다.MASM은 가장 효율적인 인코딩을 선택합니다. 오프셋은 16의 배수인 양수여야 합니다.오프셋은 프로시저의 프레임을 기준으로 합니다. 이 프레임은 일반적으로 RSP에 있거나 프레임 포인터를 사용하는 경우 배율 조정되지 않은 프레임 포인터입니다. |
.PUSHFRAME [code] |
UWOP_PUSH_MACHFRAME 해제 코드 엔트리를 생성합니다.선택 사항인 코드를 지정한 경우 해제 코드 항목에는 한정자로 1이 지정되고,그렇지 않으면 한정자로 0이 지정됩니다. |
.ENDPROLOG |
프롤로그 선언의 끝을 나타내며,함수의 처음 255바이트 내에 있어야 합니다. |
다음은 대부분의 opcode를 적절하게 사용한 함수 프롤로그 샘플입니다.
sample PROC FRAME
db 048h; emit a REX prefix, to enable hot-patching
push rbp
.pushreg rbp
sub rsp, 040h
.allocstack 040h
lea rbp, [rsp+020h]
.setframe rbp, 020h
movdqa [rbp], xmm7
.savexmm128 xmm7, 020h;the offset is from the base of the frame
;not the scaled offset of the frame
mov [rbp+018h], rsi
.savereg rsi, 038h
mov [rsp+010h], rdi
.savereg rdi, 010h; you can still use RSP as the base of the frame
; or any other register you choose
.endprolog
; you can modify the stack pointer outside of the prologue (similar to alloca)
; because we have a frame pointer.
; if we didn’t have a frame pointer, this would be illegal
; if we didn’t make this modification,
; there would be no need for a frame pointer
sub rsp, 060h
; we can unwind from the following AV because of the frame pointer
mov rax, 0
mov rax, [rax] ; AV!
; restore the registers that weren’t saved with a push
; this isn’t part of the official epilog, as described in section 2.5
movdqa xmm7, [rbp]
mov rsi, [rbp+018h]
mov rdi, [rbp-010h]
; Here’s the official epilog
lea rsp, [rbp-020h]
pop rbp
ret
sample ENDP