Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 para um número de 64 bits, os bits mais altos podem ser configurados como zero (preservando o inteiro sem sinal e o valor hexadecimal do número) ou os bits mais altos podem ser configurados como um (preservando o valor com sinal 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 do MASM
Em determinadas condições, os números são automaticamente estendidos de sinal pelo avaliador de expressões MASM. A extensão de sinal pode afetar apenas os 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 a 0xFFFFFFFF é estendido com sinal com base nos seguintes critérios:
Constantes numéricas nunca têm extensão de sinal no modo de usuário. No modo kernel, uma constante numérica é estendida pelo sinal, a menos que contenha um acento grave (`) antes dos bytes inferiores. Por exemplo, no modo kernel, os números hexadecimais EEAA1122 e 00000000EEAA1122 são estendidos por sinal, mas 00000000`EEAA1122 e 0`EEAA1122 não são.
Um registro de 32 bits passa por extensão de sinal em ambos os modos.
Os pseudo-registros são sempre armazenados como valores de 64 bits. Eles não são extensão de sinal 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 e registros individuais em uma expressão podem ser estendidos com sinal, mas nenhum outro cálculo durante a avaliação da expressão é extendido com sinal. Como resultado, você pode mascarar os bits altos de um número ou registrar usando a sintaxe a seguir.
( 0x0`FFFFFFFF & expression )
Extensão de sinal em expressões C++
Quando o depurador avalia uma expressão C++, as seguintes regras se aplicam:
Registros e pseudo-registros nunca têm extensão de sinal.
Todos os outros valores são tratados exatamente como se C++ tratasse valores de seu tipo.
Exibindo Sign-Extended e números de 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 únicos e se o bit mais alto dos 32 bits baixos também for um (ou seja, se o número for de 0xFFFFFFFF'800000000 até 0xFFFFFFFF'FFFFFFFF), o depurador assumirá que o número é um número de 32 bits estendido por sinal 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 uns 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).