Assemblerausdrücke
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Nur "Systemeigen" |
||||
Pro, Premium und Ultimate |
Nur "Systemeigen" |
Mit Ausnahme einiger Einschränkungen können Ausdrücke in Assemblersprache korrekt vom Debugger ausgewertet werden. Die für einige Ausdrücke in Assemblersprache verwendete Syntax unterscheidet sich von der Syntax, die in Entwicklungssystemen verwendet wird, die auf Assemblersprache basieren, z. B. Microsoft Macro Assembler (MASM).
Speicheroperatoren
Speicheroperatoren sind unäre Operatoren, die das Ergebnis einer direkten Speicheroperation zurückgeben. Diese Operatoren werden hauptsächlich zum Debuggen von Code in Assemblersprache verwendet.
{BY | WO | DW} address
Der Operator BY gibt eine kurze ganze Zahl zurück, die das erste Byte an der Adresse enthält. Dieser Operator simuliert BYTE PTR.
Der Operator WO gibt eine kurze ganze Zahl zurück, die den Wert des Worts (zwei Bytes) an der Adresse enthält. Dieser Operator simuliert die WORD PTR-Operation von Microsoft Macro Assembler. Der Operator DW gibt eine lange ganze Zahl zurück, die den Wert der ersten vier Bytes an der Adresse enthält. Dieser Operator simuliert DWORD PTR.
Durch den Formatbezeichner x, der in einigen dieser Beispiele verwendet wird, wird das Ergebnis im Hexadezimalformat angezeigt.
Beispiele
Zeigt das erste Byte an der Adresse der sum-Variablen an:
BY sum
Zeigt das erste Wort an der Adresse der new_set-Variablen an:
WO new_set
Zeigt das Doppelwort an der Adresse von sum an:
DW sum
Zeigt das Byte, auf das das EBP-Register zeigt, mit einem Index von 6 an:
BY ebp+6,x
Zeigt das Wort an, auf das der Stapelzeiger zeigt (das letzte auf den Stapel verschobene Wort):
WO esp,x
Zeigt das Doppelwort an, auf das das ESI-Register zeigt:
DW esi,x
Indirekte Registeradressierung
Der Debugger akzeptiert keine eckigen Klammern ([ ]) zur Angabe einer Speicheradresse, auf die ein Register zeigt. Verwenden Sie stattdessen die Operatoren BY, WO und DW, um auf die entsprechenden Byte-, Wort- oder Doppelwortwerte zu verweisen.
MASM-Ausdruck |
Debuggerausdruck |
C++-Ausdruck |
---|---|---|
BYTE PTR [bx] |
BY ebx |
*(unsigned char) ebx |
WORD PTR [bp] |
WO ebp |
*(unsigned short *) ebp |
DWORD PTR [bp] |
DW ebp |
*(unsigned long *) ebp |
Indirekte Registeradressierung mit Index
Um Basis-, Index- oder Basis-Index-Operationen im indirekten Modus unter Verwendung eines Indexes auszuführen, verwenden Sie die Operatoren BY, WO oder DW in Verbindung mit dem Additionsoperator.
MASM-Ausdruck |
Debuggerausdruck |
---|---|
BYTE PTR [edi+6] |
BY edi+6 |
BYTE PTR Test[ebx] |
BY &Test+ebx |
WORD PTR [esi][ebp+6] |
WO esi+ebp+6 |
DWORD PTR [ebx][esi] |
DW ebx+esi |
Adresse einer Variablen
Verwenden Sie den C-Adressoperator (&) anstelle des Operators OFFSET von MASM.
MASM-Ausdruck |
Debuggerausdruck |
---|---|
OFFSET Var |
&Var |
Operator PTR
Verwenden Sie Typumwandlungen oder die Operatoren BY, WO und DW in Verbindung mit dem Adressoperator (&), um den Operator PTR der Assemblersprache zu ersetzen.
MASM-Ausdruck |
Debuggerausdruck |
---|---|
BYTE PTR Var |
BY &Var |
*(unsigned char*) |
&Var |
WORD PTR Var |
WO &Var |
DWORD PTR Var |
DW &Var |
*(unsigned long*) |
&Var |
Zeichenfolgen in Assemblersprache
Fügen Sie den Formatbezeichner für Zeichenfolgen ,s hinter dem Variablennamen ein.
MASM-Ausdruck |
Debuggerausdruck |
---|---|
String |
String,s |
Da C-Zeichenfolgen mit einem Nullzeichen (ASCII 0) enden, zeigt der Debugger alle Zeichen vom ersten Byte der Variablen bis zum nächsten Nullbyte im Arbeitsspeicher an, sobald eine Zeichenfolgenanzeige angefordert wird. Wenn Sie ein in Assemblersprache geschriebenes Programm debuggen und Zeichenfolgen im Überwachungsfenster anzeigen möchten, sollten Sie Zeichenfolgen mit einem Nullzeichen beenden. Auf NULL endende oder nicht abgeschlossene Zeichenfolgen können mit dem Fenster Arbeitsspeicher auf einfache Weise angezeigt werden.
Array- und Strukturelemente
Stellen Sie einem Arraynamen den Adressoperator (&) voran, und fügen Sie den gewünschten Offset hinzu. Der Offset kann ein Ausdruck, eine Zahl, ein Registername oder eine Variable sein.
Die folgenden Beispiele verdeutlichen die Vorgehensweise für Byte-, Wort- und Doppelwortarrays.
MASM-Ausdruck |
Debuggerausdruck |
---|---|
String[12] |
BY &String+12*(&String+12) |
aWords[bx+di] |
WO &aWords+bx+di*(unsigned*)(&aWords+bx+di) |
aDWords[bx+4] |
DW &aDWords+bx+4*(unsigned long*)(&aDWords+bx+4) |