Partilhar via


estrutura UNWIND_CODE

A matriz de código de desenrolamento é usada para registrar a seqüência de operações no prólogo que afetam o RSP e registradores de não-volátil. 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

Info de 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 final 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.
    Note: Determinados códigos de operação exigem um deslocamento não assinado com um valor no quadro de pilha 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 de registrar o quadro for diferente de zero, este é o deslocamento a partir de onde o RSP estava localizado quando o reg FP foi estabelecido. Isso equivale a reg FP menos o deslocamento do reg FP (16 * o quadro dimensionado e registrar o deslocamento de UNWIND_INFO). Se um reg FP for usado, em seguida, qualquer código de desenrolamento levando um deslocamento só deve 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, como todos os valores de pilha de interesse são armazenados em limites de 8 bytes (pilha propriamente dito é sempre alinhado de 16 bytes). Para códigos de operação que levam um deslocamento curto (menos de 512 K), o final USHORT em nós para esse código contém o deslocamento dividido por 8. Para códigos de operação de levar um longo deslocamento (512 K < = deslocamento < 4 GB), os dois nós USHORT finais para esse código mantêm o deslocamento (no formato little-endian).

    Para os opcodes 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 bits devem ocorrer na memória de 16 bytes alinhada. 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 é um dos seguintes:

    UWOP_PUSH_NONVOL (0) 1 nó

    Empurre um registro inteiro não-volátil, diminuindo o RSP por 8. As informações sobre a operação são o número do registro. Observe que, por causa das restrições no epilogs, códigos de desenrolamento UWOP_PUSH_NONVOL devem aparecer primeiro no prólogo e correspondentemente, ú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

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

    UWOP_ALLOC_SMALL (2) o 1 nó

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

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

    Tamanho de alocação

    Código de desenrolamento.

    8 a 128 bytes

    UWOP_ALLOC_SMALL

    136 para 512 bytes de 8 K

    UWOP_ALLOC_LARGE, info de operação = 0

    512 K bytes de 4G–8

    UWOP_ALLOC_LARGE, info de operação = 1

    UWOP_SET_FPREG (3) 1 nó

    Estabelece o registro de ponteiro do quadro, definindo o registro para alguns deslocamento do RSP atual. 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

    Salve um registro inteiro não-volátil na pilha usando um MOV em vez de um envio. Isso é usado principalmente para shrink-wrapping, onde um registro não volátil é salvo para a pilha em uma posição que foi anteriormente alocada. As informações sobre a operação são o número do registro. O deslocamento da pilha de escalada-por-8 é registrado no próximo desenrolar o slot do código de operação, conforme descrito na observação acima.

    UWOP_SAVE_NONVOL_FAR (5) 3 nós

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

    UWOP_SAVE_XMM128 (8) de 2 nós

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

    UWOP_SAVE_XMM128_FAR nós 3 (9)

    Salve todos os 128 bits de um não-volátil XMM registrar na pilha com um deslocamento longo. As informações sobre a operação sã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ó

    Empurre um quadro de máquina. 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

    RIP

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

    RSP + 40

    SS

    RSP + 32

    RSP antigo

    RSP + 24

    EFLAGS

    RSP + 16

    CS

    RSP + 8

    RIP

    RSP

    Código de erro

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

    Pop RIP endereço de retorno da parte superior da pilha em Temp

    Empurre SS

    Empurre o RSP antigo

    Empurre EFLAGS

    Empurre o CS

    Empurre Temp

    Empurre o código de erro (se as informações de op é igual a 1)

    Diminui de operação UWOP_PUSH_MACHFRAME de simulado RSP por 40 (info de op é igual a 0) ou 48 (info de op é igual a 1).

  • Info de operação
    O significado desses 4 bits 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 to 15

    R8 to R15

Consulte também

Referência

Desenrolar dados para manipulação de exceção, suporte a depurador