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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für