다음을 통해 공유


구조체 UNWIND_CODE

해제 코드 배열은 프롤로그에서 수행되는 비volatile 레지스터와 RSP에 영향을 주는 일련의 작업을 기록하는 데 사용됩니다.각 코드 항목의 형식은 다음과 같습니다.

UBYTE

프롤로그 내 오프셋

UBYTE: 4

해제 작업 코드

UBYTE: 4

작업 정보

이 배열은 프롤로그 내 오프셋을 기준으로 내림차순으로 정렬됩니다.

  • 프롤로그 내 오프셋
    프롤로그의 시작 주소를 기준으로 이 작업을 수행하는 명령의 끝 주소에 1을 더한 오프셋입니다. 즉, 다음 명령의 시작 주소를 가리키는 오프셋입니다.

  • 해제 작업 코드
    참고: 특정 작업 코드에는 로컬 스택 프레임에 있는 값을 가리키는 부호 없는 오프셋이 필요합니다.이 오프셋의 기준은 고정 스택 할당의 시작 주소(가장 낮은 주소)입니다.UNWIND_INFO의 프레임 레지스터 필드가 0이면 이 오프셋의 기준은 RSP입니다.프레임 레지스터 필드가 0이 아니면 이 오프셋의 기준은 FP 레지스터가 설정되었을 때 RSP가 있던 주소입니다.이 값은 FP 레지스터에서 FP 레지스터 오프셋(UNWIND_INFO의 배율이 적용된 프레임 레지스터 오프셋에 16을 곱한 값)을 뺀 값과 같습니다.FP 레지스터가 사용된 경우 오프셋을 사용하는 모든 해제 코드는 프롤로그에서 FP 레지스터가 설정된 이후에만 사용해야 합니다.

    UWOP_SAVE_XMM128과 UWOP_SAVE_XMM128_FAR를 제외한 모든 작업 코드(opcode)에서 이 오프셋은 항상 8의 배수입니다. 관련된 모든 스택 값이 8바이트 경계로 저장되기 때문입니다. 스택 자체는 항상 16바이트 맞춤으로 유지됩니다.short 오프셋(512K 미만)을 사용하는 작업 코드에 대한 노드에 있는 최종 USHORT에는 오프셋을 8로 나눈 값이 저장됩니다.long 오프셋(512K 이상, 4GB 미만)을 사용하는 작업 코드에 대한 두 개의 최종 USHORT 노드에는 오프셋이 little-endian 형식으로 저장됩니다.

    모든 128비트 XMM 작업은 16바이트 맞춤 메모리에서 실행되어야 하므로 UWOP_SAVE_XMM128과 UWOP_SAVE_XMM128_FAR 작업 코드(opcode)에서는 오프셋이 항상 16의 배수입니다.따라서 UWOP_SAVE_XMM128에는 배율 인수로 16이 사용되어 1M 미만의 오프셋을 사용할 수 있습니다.

    해제 작업 코드는 다음 노드 중 하나입니다.

    UWOP_PUSH_NONVOL (0)1 노드

    비volatile 정수 레지스터를 푸시하고 RSP를 8만큼 감소시킵니다.작업 정보는 레지스터 번호입니다.에필로그의 제약 조건으로 인해 UWOP_PUSH_NONVOL 해제 코드는 프롤로그에서 맨 처음에 와야 하고 해제 코드 배열에서는 이에 상응하여 맨 마지막에 와야 합니다.UWOP_PUSH_MACHFRAME을 제외한 기타 모든 해제 코드에도 이와 같은 상대적인 순서가 적용됩니다.

    UWOP_ALLOC_LARGE (1)2 또는 3 노드

    스택에 큰 영역을 할당합니다.여기에는 다음과 같은 두 가지 형태가 있습니다.작업 정보가 0이면 다음 슬롯에 할당 크기를 8로 나눈 값이 기록되고 최대 할당 크기가 512K-8이 됩니다.작업 정보가 1이면 다음 두 슬롯에 배율이 적용되지 않은 할당 크기가 little-endian 형식으로 기록되고 최대 할당 크기가 4GB-8이 됩니다.

    UWOP_ALLOC_SMALL (2)1 노드

    스택에 작은 영역을 할당합니다.할당 크기는 작업 정보 필드에 8을 곱한 다음 8을 더한 값과 같으며 8에서 128바이트 사이의 할당이 허용됩니다.

    스택 할당에 대한 해제 코드에서는 항상 가능한 가장 짧은 인코딩을 사용해야 합니다.

    할당 크기

    해제 코드

    8에서 128바이트

    UWOP_ALLOC_SMALL

    136에서 512K-8바이트

    UWOP_ALLOC_LARGE, 작업 정보 = 0

    512K에서 4G–8바이트

    UWOP_ALLOC_LARGE, 작업 정보 = 1

    UWOP_SET_FPREG (3)1 노드

    레지스터를 현재 RSP를 기준으로 하는 오프셋으로 설정하여 프레임 포인터 레지스터를 만듭니다.이 오프셋은 UNWIND_INFO의 배율이 적용된 프레임 레지스터 오프셋 필드에 16을 곱한 값과 같으며 0에서 240까지의 오프셋을 사용할 수 있습니다.오프셋을 사용하면 고정 스택 할당의 중간을 가리키는 프레임 포인터를 설정할 수 있고 더 많은 액세스에서 short 형식 명령을 사용할 수 있으므로 코드 밀도를 높일 수 있습니다.작업 정보 필드는 예약되어 있고 사용해서는 안 됩니다.

    UWOP_SAVE_NONVOL (4)2 노드

    PUSH 대신 MOV를 사용하여 비volatile 정수 레지스터를 스택에 저장합니다.이는 주로 축소 래핑을 위해 사용됩니다. 축소 래핑에서는 비volatile 레지스터가 스택에서 이미 할당된 위치에 저장됩니다.작업 정보는 레지스터 번호입니다.위에서 설명한 것과 같이 다음 해제 작업 코드 슬롯에는 배율 8을 적용한 스택 오프셋이 기록됩니다.

    UWOP_SAVE_NONVOL_FAR (5)3 노드

    PUSH 대신 MOV를 사용하여 비volatile 정수 레지스터를 long 오프셋으로 스택에 저장합니다.이는 주로 축소 래핑을 위해 사용됩니다. 축소 래핑에서는 비volatile 레지스터가 스택에서 이미 할당된 위치에 저장됩니다.작업 정보는 레지스터 번호입니다.위에서 설명한 것과 같이 다음 두 해제 작업 코드 슬롯에는 배율이 적용되지 않은 스택 오프셋이 기록됩니다.

    UWOP_SAVE_XMM128 (8)2 노드

    비volatile 레지스터의 128비트를 모두 스택에 저장합니다.작업 정보는 레지스터 번호입니다.다음 슬롯에는 배율 16이 적용된 스택 오프셋이 기록됩니다.

    UWOP_SAVE_XMM128_FAR (9)3 노드

    비volatile 레지스터의 128비트 모두를 long 오프셋으로 스택에 저장합니다.작업 정보는 레지스터 번호입니다.다음 두 슬롯에는 배율이 적용되지 않은 스택 오프셋이 기록됩니다.

    UWOP_PUSH_MACHFRAME (10)1 노드

    시스템 프레임을 푸시합니다.이 노드는 하드웨어 인터럽트 또는 예외의 효과를 기록하는 데 사용됩니다.여기에는 다음과 같은 두 가지 형태가 있습니다.작업 정보가 0이면 스택에 다음과 같은 내용이 푸시된 것입니다.

    RSP+32

    SS

    RSP+24

    이전 RSP

    RSP+16

    EFLAGS

    RSP+8

    CS

    RSP

    RIP

    작업 정보가 1이면 스택에 다음과 같은 내용이 대신 푸시된 것입니다.

    RSP+40

    SS

    RSP+32

    이전 RSP

    RSP+24

    EFLAGS

    RSP+16

    CS

    RSP+8

    RIP

    RSP

    오류 코드

    이 해제 코드는 더미 프롤로그에 항상 나타납니다. 더미 프롤로그는 실제로 실행되지 않지만, 시스템 프레임의 푸시를 시뮬레이션할 장소를 제공하기 위한 목적으로만 인터럽트 루틴의 실제 진입점 앞에 나타납니다.UWOP_PUSH_MACHFRAME에서 기록하는 이 시뮬레이션은 컴퓨터에서 다음과 같은 작업을 수행했음을 개념적으로 나타냅니다.

    스택 맨 위에서 RIP 반환 주소를 임시 변수로 팝

    SS 푸시

    이전 RSP 푸시

    EFLAGS 푸시

    CS 푸시

    임시 변수 푸시

    오류 코드 푸시(작업 정보가 1인 경우)

    시뮬레이션된 UWOP_PUSH_MACHFRAME 작업에서는 RSP를 40(작업 정보가 0인 경우)이나 48(작업 정보가 1인 경우)만큼 감소시킵니다.

  • 작업 정보
    이들 4개 비트의 의미는 작업 코드에 따라 다릅니다.일반적인 목적의 정수 레지스터를 인코딩하는 경우 다음과 같은 매핑이 사용됩니다.

    0

    RAX

    1

    RCX

    2

    RDX

    3

    RBX

    4

    RSP

    5

    RBP

    6

    RSI

    7

    RDI

    8 ~ 15

    R8 to R15

참고 항목

참조

예외 처리 및 디버거 지원을 위한 해제 데이터