Share via


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 masm-Ausdruckssyntax in den Beispielen (sofern nicht anders angegeben). Die Syntax von C++-Ausdrücken ist sehr nützlich für das Bearbeiten von Strukturen und Variablen, analysiert aber die Parameter von Debuggerbefehlen 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 einen bestimmten Parameter benötigen, um die Syntax von C++-Ausdrücken verwenden zu können, 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.

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

Das folgende Beispiel zeigt jedoch die Adresse von myInt.

0:000> ? myInt 

Bedingte Haltepunkte

Sie können Vergleichsoperatoren verwenden, um bedingte Haltepunkte zu erstellen. Im folgenden Codebeispiel wird masm-Ausdruckssyntax verwendet. Da der aktuelle Standardradiix 16 ist, wird im Beispiel das Präfix 0n verwendet, 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 über den poi-Operator verfügen, um MyVar zu dereferenzieren.

Bedingte Ausdrücke

Im folgenden Beispiel wird der Wert von ecx ausgegeben, wenn eax größer als ebx ist, 7, wenn eax kleiner als ebx ist, und 3, wenn eax gleich ebx ist. In diesem Beispiel wird die MASM-Ausdrucksauswertung verwendet, sodass das Gleichheitszeichen (=) ein Vergleichsoperator und kein Zuweisungsoperator 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 umgewandelt werden. Daher wird in der C++-Syntax der vorherige Befehl wie folgt angezeigt.

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

Beispiele für MASM und C++-Gemischte Ausdrücke

Sie können keine Quellzeilenausdrücke in einem C++-Ausdruck verwenden. Im folgenden Beispiel wird die alternative Auswertungssyntax @@( ) verwendet, um einen MASM-Ausdruck in einen C++-Ausdruck zu schachteln. 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 Standardauswertung von Ausdrücken auf MASM festgelegt und anschließend Expression2 als C++-Ausdruck ausgewertet und Expression1 und Expression3 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 diesem Wert im Speicher eine weitere ULONG64 folgt, können Sie einen Zugriffshaltepunkt an dieser Stelle festlegen, indem Sie eines der folgenden Beispiele verwenden. (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

Sign-Erweiterung