Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Diese Themen enthalten Beispiele für MASM- und C++-Ausdrücke, die in verschiedenen Befehlen verwendet werden.
Alle anderen Abschnitte dieser Hilfedokumentation verwenden die MASM-Ausdruckssyntax in den Beispielen (sofern nicht anders angegeben). C++-Ausdruckssyntax ist sehr nützlich für die Bearbeitung von Strukturen und Variablen, aber sie analysiert 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 (Ausdrucks-Evaluator 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 Wenn Sie den MASM-Ausdrucksauswert 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 die MASM-Ausdruckssyntax verwendet. Da der aktuelle Standardradiix 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 den Poi-Operator aufweisen, um MyVar abzuleiten.
Bedingte Ausdrücke
Im folgenden Beispiel wird der Wert von ecx gedruckt, wenn eax größer als ebx ist, 7, wenn eax kleiner als ebx ist, und 3, wenn eaxgleich 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 in der C++-Syntax der vorherige Befehl wie folgt:
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 Evaluator-Syntax @@( ) verwendet, um einen MASM-Ausdruck in einen C++-Ausdruck einzuschachteln. In diesem Beispiel wird "MyPtr" auf die Adresse von Zeile 43 der Datei "Myfile.c" festgelegt.
0:000> ?? MyPtr = @@( `myfile.c:43` )
In den folgenden Beispielen wird der Standardausdrucksauswerter auf MASM festgelegt, dann wird Expression2 als C++-Ausdruck ausgewertet, und Expression1 und Expression3 als MASM-Ausdrücke.
0:000> .expr /s masm
0:000> bp Expression1 + @@( Expression2 ) + Expression3
Wenn myInt ein ULONG64 Wert ist und Sie wissen, dass dieser Wert im Arbeitsspeicher von einem anderen ULONG64 folgt, können Sie einen Zugriffstrennpunkt an diesem Speicherort mithilfe eines der folgenden Beispiele festlegen. (Beachten Sie die Verwendung von Zeigerarithmetik.)
0:000> ba r8 @@( &myInt + 1 )
0:000> ba r8 myInt + 8