Extension de signe
Lorsqu’un entier signé 32 bits est négatif, son bit le plus élevé est égal à un. Lorsque cet entier signé 32 bits est converti en nombre 64 bits, les bits élevés peuvent être définis sur zéro (en conservant l’entier non signé et la valeur hexadécimale du nombre) ou les bits élevés peuvent être définis sur un (en conservant la valeur signée du nombre). Cette dernière situation est appelée extension de signe.
Le débogueur suit des règles différentes pour l’extension de connexion dans les expressions MASM, dans les expressions C++ et lors de l’affichage de nombres.
Extension de connexion dans les expressions MASM
Dans certaines conditions, les nombres sont automatiquement signés étendus par l’évaluateur d’expression MASM. L’extension de signe peut affecter uniquement les nombres de 0x80000000 à 0xFFFFFFFF. Autrement dit, l’extension de signe affecte uniquement les nombres qui peuvent être écrits en 32 bits avec le bit élevé égal à 1.
Le nombre 0x12345678 reste toujours 0x00000000'12345678 lorsque le débogueur le traite comme un nombre 64 bits. En revanche, quand 0x890ABCDE est traitée comme une valeur 64 bits, elle peut rester 0x00000000'890ABCDE ou l’évaluateur d’expression MASM peut signer l’extension à 0xFFFFFFFF'890ABCDE.
Un nombre compris entre 0x80000000 et 0xFFFFFFFF est étendu en fonction des critères suivants :
Les constantes numériques ne sont jamais étendues en mode utilisateur. En mode noyau, une constante numérique est étendue, sauf si elle contient un accent grave ( ` ) avant les octets faibles. Par exemple, en mode noyau, les nombres hexadécimaux EEAA1122 et 00000000EEAA1122 sont étendus, mais 00000000'EEAA1122 et 0'EEAA1122 ne le sont pas.
Un registre 32 bits est étendu dans les deux modes.
Les pseudo-registres sont toujours stockés sous forme de valeurs 64 bits. Elles ne sont pas étendues de signe lorsqu’elles sont évaluées. Lorsqu’une valeur est affectée à un pseudo-registre, l’expression utilisée est évaluée selon les critères C++ standard.
Les nombres individuels et les registres dans une expression peuvent être étendus par signe, mais aucun autre calcul pendant l’évaluation de l’expression n’est étendu aux signes. Par conséquent, vous pouvez masquer les bits élevés d’un nombre ou inscrire à l’aide de la syntaxe suivante.
( 0x0`FFFFFFFF & expression )
Extension de connexion dans les expressions C++
Lorsque le débogueur évalue une expression C++, les règles suivantes s’appliquent :
Les registres et les pseudo-registres ne sont jamais étendus.
Toutes les autres valeurs sont traitées exactement comme C++ traiterait les valeurs de leur type.
Affichage des nombres Sign-Extended et 64 bits
À part les registres 32 bits et 16 bits, tous les nombres sont stockés en interne dans le débogueur sous forme de valeurs 64 bits. Toutefois, lorsqu’un nombre satisfait à certains critères, le débogueur l’affiche sous la forme d’un nombre de 32 bits dans la sortie de commande.
Le débogueur utilise les critères suivants pour déterminer comment afficher des nombres :
Si les 32 bits élevés d’un nombre sont tous des zéros (autrement dit, si le nombre est compris entre 0x00000000'000000000 à 0x00000000'FFFFFFFF), le débogueur affiche le nombre sous la forme d’un nombre de 32 bits.
Si les 32 bits les plus élevés d’un nombre sont tous des bits et si le bit le plus élevé des 32 bits inférieurs est également un nombre (autrement dit, si le nombre est compris entre 0xFFFFFFFF'8000000000 à 0xFFFFFFFF’FFFFFFFF), le débogueur suppose que le nombre est un nombre 32 bits étendu par signe et l’affiche sous la forme d’un nombre 32 bits.
Si les deux conditions précédentes ne s’appliquent pas (autrement dit, si le nombre est compris entre 0x00000001'00000000000 à 0xFFFFFFFF'7FFFFFFF), le débogueur affiche le nombre sous la forme d’un nombre 64 bits.
En raison de ces règles d’affichage, lorsqu’un nombre est affiché sous la forme d’un nombre 32 bits de 0x80000000 à 0xFFFFFFFF, vous ne pouvez pas confirmer si les 32 bits élevés sont tous des zéros ou des zéros. Pour faire la distinction entre ces deux cas, vous devez effectuer un calcul supplémentaire sur le nombre (par exemple, masquer un ou plusieurs des bits élevés et afficher le résultat).