Exemples d'expressions mixtes
Cette rubrique contient des exemples d'expressions MASM et C++ utilisées dans diverses commandes.
Toutes les autres sections de cette documentation d'aide utilisent la syntaxe des expressions MASM dans les exemples (sauf indication contraire). La syntaxe des expressions C++ est très utile pour manipuler les structures et les variables, mais elle n'analyse pas très bien les paramètres des commandes du débogueur.
Si vous utilisez les commandes du débogueur à des fins générales ou si vous utilisez des extensions de débogueur, vous devez définir la syntaxe des expressions MASM comme syntaxe par défaut, par exemple en utilisant .expr (Choisissez l'évaluateur d'expressions). Si vous devez utiliser un paramètre spécifique avec la syntaxe des expressions C++, utilisez la syntaxe @@( ).
Si myInt est une valeur ULONG32 et si vous utilisez l'évaluateur d'expressions MASM, les deux exemples suivants montrent la valeur de MyInt.
0:000> ?? myInt
0:000> dd myInt L1
Cependant, l'exemple suivant montre l'adresse de myInt.
0:000> ? myInt
Points d'arrêt conditionnels
Vous pouvez utiliser des opérateurs de comparaison pour créer des points d'arrêt conditionnels. L'exemple de code suivant utilise la syntaxe des expressions MASM. Étant donné que la base par défaut actuelle est 16, l'exemple utilise le préfixe 0n pour que le nombre 20 soit compris comme un nombre décimal.
0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' "
Dans l'exemple précédent, MyVar est un entier dans le code source C. Étant donné que l'analyseur MASM traite tous les symboles comme des adresses, l'exemple doit utiliser l'opérateur poi pour déréférencer MyVar.
Expressions conditionnelles
L'exemple suivant imprime la valeur de ecx si eax est supérieur à ebx, 7 si eax est inférieur à ebx, et 3 si eax est égal à ebx. Cet exemple utilise l'évaluateur d'expressions MASM, donc le signe égal (=) est un opérateur de comparaison, et non un opérateur d'affectation.
0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx)
En syntaxe C++, le signe @ indique un registre, un double signe égal (==) est l'opérateur de comparaison, et le code doit explicitement caster de BOOL en int. Par conséquent, en syntaxe C++, la commande précédente devient la suivante.
0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx)
Exemples d'expressions mixtes MASM et C++
Vous ne pouvez pas utiliser des expressions de ligne de source dans une expression C++. L'exemple suivant utilise la syntaxe alternative de l'évaluateur @@( ) pour imbriquer une expression MASM dans une expression C++. Cet exemple définit MyPtr égal à l'adresse de la ligne 43 du fichier Myfile.c.
0:000> ?? MyPtr = @@( `myfile.c:43` )
Les exemples suivants définissent l'évaluateur d'expressions par défaut sur MASM, puis évaluent Expression2 comme une expression C++, et évaluent Expression1 et Expression3 comme des expressions MASM.
0:000> .expr /s masm
0:000> bp Expression1 + @@( Expression2 ) + Expression3
Si myInt est une valeur ULONG64 et si vous savez que cette valeur est suivie en mémoire par un autre ULONG64, vous pouvez définir un point d'arrêt d'accès à cet emplacement en utilisant l'un des exemples suivants. (Remarquez l'utilisation de l'arithmétique des pointeurs.)
0:000> ba r8 @@( &myInt + 1 )
0:000> ba r8 myInt + 8