Freigeben über


Beispiele für gemischte Ausdrücke

Dieses Thema enthält Beispiele für MASM- und C++-Ausdrücke, die in verschiedenen Befehlen verwendet werden.

Alle anderen Abschnitte dieser Hilfedokumentation verwenden in den Beispielen die MASM-Ausdruckssyntax (sofern nicht anders angegeben). Die C++-Ausdruckssyntax ist für die Veränderung von Strukturen und Variablen sehr nützlich, analysiert die Parameter von Debuggerbefehlen jedoch nicht sehr gut.

Wenn Sie Debuggerbefehle für allgemeine Zwecke oder Debuggererweiterungen verwenden, sollten Sie die MASM-Ausdruckssyntax als Standardsyntax festlegen, z. B. mithilfe von .expr (Ausdrucksauswertung auswählen). Wenn Sie über einen bestimmten Parameter verfügen müssen, um die C++-Ausdruckssyntax zu verwenden, verwenden Sie die @@( )-Syntax.

Wenn myInt ein ULONG32-Wert ist und Sie die MASM-Ausdrucksauswertung verwenden, zeigen die folgenden beiden Beispiele den Wert von MyInt an.

0:000> ?? myInt 
0:000> dd myInt L1 

Das folgende Beispiel zeigt jedoch die Adresse von myInt an.

0:000> ? myInt 

Bedingte Haltepunkte

Sie können Vergleichs-Operatoren verwenden, um bedingte Haltepunkte zu erstellen. Im folgenden Codebeispiel wird die MASM-Ausdruckssyntax verwendet. Da die aktuelle Standardbasis 16 ist, verwendet das Beispiel das Präfix 0n, sodass die Zahl 20 als Dezimalzahl verstanden wird.

0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 

Im vorherigen Beispiel ist MyVar eine ganze Zahl in der C-Quelle. Da der MASM-Parser alle Symbole als Adressen behandelt, muss das Beispiel ein poi-Operator sein, um MyVar zu dereferenzieren.

Bedingte Ausdrücke

Das folgende Beispiel gibt den Wert vonecx aus, wenn eax größer als ebx ist, 7, wenn eax kleiner als ebx ist, und 3 falls eax gleich ebx ist. In diesem Beispiel wird die MASM-Ausdrucksauswertung verwendet, sodass das Gleichheitszeichen (=) ein Vergleichsoperator und kein Zuordnungsoperator ist.

0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 

In der C++-Syntax gibt das @-Zeichen ein Register an, ein doppeltes Gleichheitszeichen (==) ist der Vergleichsoperator, und Code muss explizit von BOOL in int umwandeln. Daher wird der vorherige Befehl in der C++-Syntax zu Folgendem.

0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 

Beispiele für gemischte Ausdrücke für MASM und C++

Sie können keine Quellzeilenausdrücke in einem C++-Ausdruck verwenden. Im folgenden Beispiel wird die alternative Auswertungssyntax @@( ) verwendet, um einen MASM-Ausdruck in einem C++-Ausdruck zu verschachteln. In diesem Beispiel wird MyPtr gleich der Adresse der Zeile 43 der Datei Myfile.c festgelegt.

0:000> ?? MyPtr = @@( `myfile.c:43` )

In den folgenden Beispielen wird die standardmäßige Ausdrucksauswertung auf MASM festgelegt. Anschließend wird Expression2 als ein C++-Ausdruck und Expression1 und Expression3 werden als MASM-Ausdrücke ausgewertet.

0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 

Wenn myInt ein ULONG64-Wert ist und Sie wissen, dass auf diesen Wert im Speicher ein weiterer ULONG64 folgt, können Sie mithilfe eines der folgenden Beispiele an dieser Stelle einen Zugriffshaltepunkt festlegen. (Beachten Sie die Verwendung der Zeigerarithmetik.)

0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8 

Weitere Informationen

MASM-Nummern und -Operatoren

C++-Nummern und -Operatoren

MASM-Ausdrücke im Vergleich zu C++-Ausdrücken

Zeichenerweiterung