Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Quando um inteiro assinado de 32 bits é negativo, seu bit mais alto é igual a um. Quando esse inteiro assinado de 32 bits é convertido em um número de 64 bits, os bits altos podem ser definidos como zero (preservando o inteiro não assinado e o valor hexadecimal do número) ou os bits altos podem ser definidos como um (preservando o valor assinado do número). Esta última situação é chamada extensão de sinal.
O depurador segue regras diferentes para 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
Sob certas condições, os números são automaticamente assinados estendidos pelo avaliador de expressão MASM. A extensão de sinal pode afetar apenas números entre 0x80000000 e 0xFFFFFFFF. Ou seja, a extensão de sinal afeta apenas números que podem ser escritos 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 base nos seguintes critérios:
As constantes numéricas nunca são sinal estendido no modo de usuário. No modo kernel, uma constante numérica é sinal estendido, a menos que contenha um acento grave ( ` ) antes dos bytes baixos. Por exemplo, no modo kernel, os números hexadecimais EEAA1122 e 00000000EEAA1122 são sinal estendido, mas 00000000'EEAA1122 e 0'EEAA1122 não são.
Um registro de 32 bits é um sinal estendido em ambos os modos.
Os pseudo-registos são sempre armazenados como valores de 64 bits. Eles não são sinal estendido 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 de sinal, mas nenhum outro cálculo durante a avaliação da expressão é estendido de 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++, aplicam-se as seguintes regras:
Registos e pseudo-registos nunca são assinados prorrogados.
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 registradores 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 satisfaz 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 até 0x00000000'FFFFFFFF), o depurador exibirá o número como um número de 32 bits.
Se os 32 bits altos de um número são todos uns e se o bit mais alto dos 32 bits baixos também está definido como um (isto é, se o número está no intervalo de 0xFFFFFFFF'80000000 até 0xFFFFFFFF'FFFFFFFF), o depurador assume que o número é um número de 32 bits com extensão de sinal e o exibe como se fosse 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 a 0xFFFFFFFF, você não pode confirmar se os 32 bits altos são todos uns ou todos os zeros. Para distinguir entre esses dois casos, você deve executar um cálculo adicional no número (como mascarar um ou mais dos bits altos e exibir o resultado).