Compartilhar 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 e o RSP permanentes.Cada item de código possui o seguinte formato:

UBYTE

Deslocamento no prolog

UBYTE: 4

Desenrole o código de operação

UBYTE: 4

Informações da operação

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

  • Deslocamento no prolog
    Desloque do início de prólogo final da instrução que executa essa operação, mais 1 (isto é, o deslocamento do início da próxima instrução).

  • Desenrolar código de operação
    Observação: Alguns códigos de operação requerem um deslocamento sem sinal para um valor no quadro de pilha local.Esse deslocamento é o início (o menor) endereço de alocação de pilha fixa.Se o campo do registro do quadro no UNWIND_INFO é zero, esse deslocamento é de RSP.Se o campo do registro do quadro é diferente de zero, este é o deslocamento de onde RSP foi encontrado ao registro de FP foi estabelecido.Isso é igual ao registro de FP menos o deslocamento do registro de FP (16 * o registro dimensionado do quadro deslocado no UNWIND_INFO).Se um registro de FP é usado, então qualquer desenrola o código que utiliza um deslocamento deve ser usado somente após o registro de FP é estabelecida no prólogo.

    Para todos os opcodes exceto UWOP_SAVE_XMM128 e UWOP_SAVE_XMM128_FAR, o deslocamento será sempre um a partir de 8, porque o heap todos valores de interesse são armazenados em 8 limites de byte (a pilha em si é sempre o byte alinhado 16).Para códigos de operação que têm um deslocamento abreviada (menor que 512K), o USHORT final em nós para que contém esse código o deslocamento se dividiu por 8.Para códigos de operação que têm um deslocamento longo (<= 512K deslocado < 4GB), os dois nós finais de USHORT para esse código contém o deslocamento (no formato pequeno - endian).

    Para os UWOP_SAVE_XMM128 opcodes e UWOP_SAVE_XMM128_FAR, o deslocamento será sempre um a partir de 16, desde que todas as operações de 128 MMX de bit devem ocorrer na memória alinhada 16 bytes.Portanto, um fator de escala de 16 é usado para UWOP_SAVE_XMM128, permitindo deslocamentos de menos de 1M.

    O código de operação de desenrolamento é um dos seguintes:

    UWOP_PUSH_NONVOL (0) 1 nó

    Empurre permanente um registro inteiro, decrescendo RSP por 8.Informações da operação é o número de registro.Observe que, devido às restrições em epílogos, UWOP_PUSH_NONVOL desenrolam códigos devem aparecer primeiro no prólogo e correspondentemente, último na matriz de código de desenrolamento.Este pedido de relativo se aplica a todos os outros códigos desenrola exceto UWOP_PUSH_MACHFRAME.

    1) 2 Ou 3 (nó de UWOP_ALLOC_LARGE

    Atribua uma área maior redimensionada na pilha.Há duas formas.Se a informação da operação é igual a 0, então o tamanho de alocação dividido por 8 é gravado no slot seguir, permitindo uma alocação até 512K – 8.Se a informação da operação é igual a 1, então o tamanho não sofrem escala de alocação é gravado nos dois seguintes slots no formato pequeno - endian, permitindo alocações até 4GB – 8.

    UWOP_ALLOC_SMALL (2) 1 nó

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

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

    Tamanho de alocação

    Desenrole o código

    8 a 128 bytes

    UWOP_ALLOC_SMALL

    136 bytes para 512K-8

    UWOP_ALLOC_LARGE, informações da operação = 0

    512K em bytes 4G-8

    UWOP_ALLOC_LARGE, informações da operação = 1

    UWOP_SET_FPREG (3) 1 nó

    Estabeleça o registro do ponteiro de quadro definindo o registro a qualquer deslocamento de RSP atual.O deslocamento é igual ao campo de deslocamento de registro do quadro (dimensionado) no UNWIND_INFO * 16, permitindo que deslocam 0 a 240.O uso de um deslocamento permite estabelecer um ponteiro de quadro que aponta para o meio de alocação de pilha fixa, ajudando densidade de código permitindo que acessa mais curtas usar formulários de declaração.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 permanente inteiro na pilha usando um MOV em vez de um ENVIO.Isso é usado primariamente psiquiatra- envolvendo, onde o registro é salvo permanente à pilha em uma posição que é atribuída anteriormente.Informações da operação é o número de registro.O deslocamento da pilha scaled-by-8 é gravado no seguinte desenrola o encaixe de código de operação, como descrito em observação acima.

    UWOP_SAVE_NONVOL_FAR (5) 3 nós

    Salvar um registro permanente inteiro na pilha com um deslocamento longo, usando um MOV em vez de um ENVIO.Isso é usado primariamente psiquiatra- envolvendo, onde o registro é salvo permanente à pilha em uma posição que é atribuída anteriormente.Informações da operação é o número de registro.O deslocamento não sofrem escala de pilha é identificado nos dois seguintes desenrola slots de código de operação, como descrito em observação acima.

    UWOP_SAVE_XMM128 (8) 2 nós

    Salve todos os 128 bits de um registro permanente de MMX na pilha.Informações da operação é o número de registro.O deslocamento da pilha scaled-by-16 é gravado no slot seguir.

    UWOP_SAVE_XMM128_FAR (9) 3 nós

    Salve todos os 128 bits de um registro permanente de MMX na pilha com um deslocamento longo.Informações da operação é o número de registro.O deslocamento não sofrem escala de pilha é identificado nos dois slots seguir.

    UWOP_PUSH_MACHFRAME (10) 1 nó

    Empurre um quadro do computador.Isso é usado para registrar o efeito de uma interrupção ou uma exceção de hardware.Há duas formas.Se a informação da operação é igual a 0, o seguinte é empurrado na pilha:

    RSP+32

    SS

    RSP+24

    RSP antigo

    RSP+16

    EFLAGS

    RSP+8

    CS

    RSP

    RASGO

    Se a informação da operação é igual a 1, então o seguinte é empurrado em vez disso:

    RSP+40

    SS

    RSP+32

    RSP antigo

    RSP+24

    EFLAGS

    RSP+16

    CS

    RSP+8

    RASGO

    RSP

    Código de erro

    Isso desenrola o código aparecerá sempre em um prólogo fictício, que nunca seja executado realmente mas aparece em vez antes do ponto de entrada real de uma rotina de interrupção, e existe somente para fornecer um local para simular o envio de um quadro do computador.Registros de UWOP_PUSH_MACHFRAME que a simulação, que indica o computador fez conceitual o seguinte:

    Aparecer o endereço de retorno de RASGO de parte superior da pilha em Temp

    Empurre SS

    Empurre RSP antigo

    Empurre EFLAGS

    Empurre o CS

    Empurre o Temp

    Empurre o código de erro (iguais se os op 1 de informações)

    A operação simulada de UWOP_PUSH_MACHFRAME diminui RSP por 40 (informações op é igual a 0) ou por 48 (informações op é igual a 1).

  • Informações de operação
    O significado desses 4 bits depende do código de operação.Para codificar um registro comumente usados (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

Unwind Data for Exception Handling, Debugger Support