Partilhar via


struct UNWIND_CODE

A matriz de código de desenrolamento é usada para registrar a sequência de operações no prólogo que afetam os registros não-volátil e RSP.Cada item de código tem o seguinte formato:

UBYTE

Deslocamento no prólogo

UBYTE: 4

Código de operação de desenrolamento

UBYTE: 4

Informações da operação

A matriz é classificada por ordem decrescente de deslocamento no prólogo.

  • Deslocamento no prólogo
    Deslocamento do início do prólogo do participante da instrução que executa essa operação, além de 1 (ou seja, o deslocamento do início da próxima instrução).

  • Código de operação de desenrolamento
    Observação: Determinados códigos de operação requer um deslocamento não assinado com um valor no registro de ativação local.Esse deslocamento é desde o início (endereço mais baixo) da alocação de pilha fixa.Se o campo quadro registrar o UNWIND_INFO for zero, esse deslocamento é de RSP.Se o campo quadro Register for diferente de zero, este é o deslocamento a partir de onde o RSP estava localizado quando o reg FP foi estabelecido.Isso equivale o reg FP menos o deslocamento do reg FP (16 * quadro dimensionado registrar deslocamento no UNWIND_INFO).Se for usado um reg FP, qualquer código de desenrolamento levando um deslocamento deve apenas ser usado depois de estabelecer o reg FP no prólogo.

    Para todos os opcodes exceto UWOP_SAVE_XMM128 e UWOP_SAVE_XMM128_FAR, o deslocamento sempre será um múltiplo de 8, porque todos os valores de pilha de interesse são armazenados em limites de 8 byte (a pilha propriamente dito é sempre alinhado de 16 byte).Para códigos de operação que levam um deslocamento curto (menos de 512 K), o final USHORT em nós para que este código contém o deslocamento dividido por 8.Para códigos de operação que levam um deslocamento longo (512 K < = deslocamento < 4 GB), os dois nós USHORT finais para esse código mantêm o deslocamento (no formato little-endian).

    Para a operação UWOP_SAVE_XMM128 e UWOP_SAVE_XMM128_FAR, o deslocamento sempre será um múltiplo de 16, já que todas as operações de XMM de 128 bit devem ocorrer na memória alinhada de 16 byte.Portanto, um fator de escala de 16 é usado para UWOP_SAVE_XMM128, permitindo que os deslocamentos de menos de 1 M.

    O código de operação de desenrolamento é uma das seguintes opções:

    UWOP_PUSH_NONVOL (0) 1 nó

    Empurre um registro inteiro não-volátil, diminuindo RSP por 8.As informações sobre a operação é o número do registro.Observe que, por causa das restrições de epilogs, UWOP_PUSH_NONVOL desenrolamento códigos devem aparecer primeiro no prólogo e, último na matriz de código de desenrolamento.Essa ordem relativa se aplica a todos os códigos de desenrolamento exceto UWOP_PUSH_MACHFRAME.

    Nós UWOP_ALLOC_LARGE (1) 2 ou 3

    alocar uma área de grande porte na pilha.Há duas formas.Se as informações sobre a operação é igual a 0 e, em seguida, o dimensionar da alocação dividido por 8 é registrado no slot próximo, permitindo que uma alocação até 512 K, 8.Se as informações sobre a operação é igual a 1 e, em seguida, o dimensionar fora de escala de alocação de é registrado nos próximos dois slots no formato little-endian, permitindo que as alocações de até 4 GB – 8.

    (2) UWOP_ALLOC_SMALL 1 nó

    Aloca uma área na pilha de pequeno porte.O dimensionar de alocação de é o campo de informações da operação * 8 + 8, permitindo que as alocações de 8 a 128 bytes.

    O código de desenrolamento para uma pilha de alocação deve sempre usar a menor possível codificação:

    dimensionar de alocação

    Desenrolar código

    8 a 128 bytes

    UWOP_ALLOC_SMALL

    136 para 512 bytes de 8 K

    UWOP_ALLOC_LARGE, operação info = 0

    512 K bytes 4G–8

    UWOP_ALLOC_LARGE, operação info = 1

    UWOP_SET_FPREG (3) 1 nó

    Estabelece o registro de ponteiro do quadro, definindo o registro para alguns deslocamento do RSP corrente.O deslocamento é igual o campo de (escala) deslocamento quadro registrar o UNWIND_INFO * 16, permitindo que os deslocamentos de 0 a 240.O uso de um deslocamento permite o estabelecimento de um ponteiro de quadro que aponta para o meio da alocação de pilha fixa, ajudando a densidade de código, permitindo que mais acessos usar formulários de instrução curto.Observe que o campo de informações da operação é reservado e não deve ser usado.

    UWOP_SAVE_NONVOL (4) 2 nós

    salvar um registro inteiro não-volátil em pilha usando um MOV em vez de um PUSH.Isso é usado principalmente para reduzir-wrapping, onde um registro não volátil foi salvo para a pilha em uma posição que foi alocada anteriormente.As informações sobre a operação é o número do registro.O deslocamento de pilha dimensionado-por-8 é registrado no próximo slot de código de operação de desenrolamento sistema autônomo descrito na observação acima.

    UWOP_SAVE_NONVOL_FAR (5) 3 nós

    Salvar um registro inteiro não-volátil na pilha com um deslocamento de tempo, usando um MOV em vez de um PUSH.Isso é usado principalmente para reduzir-wrapping, onde um registro não volátil foi salvo para a pilha em uma posição que foi alocada anteriormente.As informações sobre a operação é o número do registro.O deslocamento de pilha fora de escala é registrado no próximo dois desenrolar slots de código de operação, conforme descrito na observação acima.

    UWOP_SAVE_XMM128 nós de 2 (8)

    salvar todos os 128 bits de um não-volátil XMM registrar na pilha.As informações sobre a operação é o número do registro.O deslocamento de pilha em escala por 16 é registrado na próximo ao slot.

    UWOP_SAVE_XMM128_FAR nós 3 (9)

    salvar todos os 128 bits de um não-volátil XMM registrar a pilha com um deslocamento de tempo.As informações sobre a operação é o número do registro.O deslocamento de pilha fora de escala é registrado nos próximos dois slots.

    UWOP_PUSH_MACHFRAME (10) 1 nó

    push um quadro de computador.Isso é usado para registrar o efeito de uma interrupção de hardware ou exceção.Há duas formas.Se as informações sobre a operação for igual a 0, a seguir foi pressionada na pilha:

    RSP + 32

    SS

    RSP + 24

    RSP antigo

    RSP + 16

    EFLAGS

    RSP + 8

    CS

    RSP

    COPIAR DO CD

    Se as informações sobre a operação é igual a 1, e, em seguida, o seguinte, em vez disso, foi pressionado:

    RSP + 40

    SS

    RSP + 32

    RSP antigo

    RSP + 24

    EFLAGS

    RSP + 16

    CS

    RSP + 8

    COPIAR DO CD

    RSP

    Código de erro

    Esse código de desenrolamento sempre aparecerá no prólogo fictício, que, na verdade, nunca é executado, mas aparece antes do ponto de entrada real de uma rotina de interrupção em vez disso e existe somente para oferecer um local para simular o push de um quadro de computador.UWOP_PUSH_MACHFRAME registra essa simulação, que indica que a computador conceitualmente concluído o seguinte:

    Pop copiar do CD endereço para devolução de cima da pilha em Temp

    push SS

    push RSP antigo

    push EFLAGS

    push CS

    De pushTemp

    Empurre o código de erro (se op info é igual a 1)

    As simulados UWOP_PUSH_MACHFRAME operação decrementa RSP por 40 (op info é igual a 0) ou 48 (op info é igual a 1).

  • Informações da operação
    O significado desses bits 4 depende do código de operação.Para codificar um registrador de propósito geral (inteiro), o seguinte mapeamento é usado:

    0

    RAX

    1

    RCX

    2

    RDX

    3

    RBX

    4

    RSP

    5

    RBP

    6

    RSI

    7

    RDI

    8 a 15

    R8 para R15

Consulte também

Referência

Desenrolar dados para exceção Handling, suporte do depurador