Assinar Extensão
Quando um inteiro com sinal de 32 bits é negativo, seu bit mais alto é igual a um. Quando esse inteiro com sinal de 32 bits é convertido em um número de 64 bits, os bits altos podem ser definidos como zero (preservando o inteiro sem sinal e o valor hexadecimal do número) ou os bits altos podem ser definidos como um (preservando o valor assinado do número). A última situação é chamada de extensão de sinal.
O depurador segue regras diferentes para a extensão de sinal em expressões MASM, em expressões C++ e ao exibir números.
Extensão de sinal em expressões MASM
Em determinadas condições, os números são automaticamente assinados estendidos pelo avaliador de expressão MASM. A extensão de sinal só pode afetar números de 0x80000000 até 0xFFFFFFFF. Ou seja, a extensão de sinal afeta apenas números que podem ser gravados em 32 bits com o bit alto igual a 1.
O número 0x12345678 sempre permanece 0x00000000 12345678 quando o depurador o trata como um número de 64 bits. Por outro lado, quando 0x890ABCDE é tratado como um valor de 64 bits, ele pode permanecer 0x00000000'890ABCDE ou o avaliador de expressão MASM pode assinar estendê-lo para 0xFFFFFFFF'890ABCDE.
Um número de 0x80000000 até 0xFFFFFFFF é assinado estendido com base nos seguintes critérios:
Constantes numéricas nunca são assinadas no modo de usuário. No modo kernel, uma constante numérica é estendida por sinal, a menos que contenha um acento grave ( ` ) antes dos bytes baixos. Por exemplo, no modo kernel, os números hexadecimal EEAA1122 e 00000000EEAA1122 são estendidos por sinal, mas 0000000000'EEAA1122 e 0'EEAA1122 não são.
Um registro de 32 bits é um sinal estendido em ambos os modos.
Pseudo-registros são sempre armazenados como valores de 64 bits. Eles não são assinados estendidos quando são avaliados. Quando um pseudo-registro recebe um valor, a expressão usada é avaliada de acordo com os critérios padrão do C++.
Números individuais e registros em uma expressão podem ser estendidos por sinal, mas nenhum outro cálculo durante a avaliação da expressão é estendido por sinal. Como resultado, você pode mascarar os bits altos de um número ou registrar usando a sintaxe a seguir.
( 0x0`FFFFFFFF & expression )
Assinar extensão em expressões C++
Quando o depurador avalia uma expressão C++, as seguintes regras se aplicam:
Registros e pseudo-registros nunca são assinados estendidos.
Todos os outros valores são tratados exatamente como C++ trataria valores de seu tipo.
Exibindo números de Sign-Extended e 64 bits
Além dos registros de 32 bits e 16 bits, todos os números são armazenados internamente no depurador como valores de 64 bits. No entanto, quando um número atende a determinados critérios, o depurador o exibe como um número de 32 bits na saída do comando.
O depurador usa os seguintes critérios para determinar como exibir números:
Se os 32 bits altos de um número forem todos zeros (ou seja, se o número for de 0x00000000'00000000 a 0x00000000'FFFFFFFF), o depurador exibirá o número como um número de 32 bits.
Se os 32 bits altos de um número forem todos ones e se o bit mais alto dos 32 bits baixos também for um (ou seja, se o número for de 0xFFFFFFFF'80000000 até 0xFFFFFFFF'FFFFFFFF), o depurador assumirá que o número é um número estendido por sinal de 32 bits e o exibirá como um número de 32 bits.
Se as duas condições anteriores não se aplicarem (ou seja, se o número for de 0x00000001'00000000 a 0xFFFFFFFF'7FFFFFFF), o depurador exibirá o número como um número de 64 bits.
Devido a essas regras de exibição, quando um número é exibido como um número de 32 bits de 0x80000000 até 0xFFFFFFFF, você não pode confirmar se os 32 bits altos são todos um ou todos zeros. Para distinguir entre esses dois casos, você deve executar uma computação adicional no número (como mascarar um ou mais bits altos e exibir o resultado).