Sign-Erweiterung
Wenn eine 32-Bit-Ganzzahl mit Vorzeichen negativ ist, ist das höchste Bit gleich 1. Wenn diese 32-Bit-Ganzzahl mit Vorzeichen in eine 64-Bit-Zahl umgewandelt wird, können die hohen Bits auf Null festgelegt werden (wobei die ganze Zahl ohne Vorzeichen und der Hexadezimalwert der Zahl beibehalten werden), oder die hohen Bits können auf 1 festgelegt werden (wobei der Vorzeichenwert der Zahl beibehalten wird). Letztere Situation wird als Zeichenerweiterung bezeichnet.
Der Debugger befolgt verschiedene Regeln für die Zeichenerweiterung in MASM-Ausdrücken, in C++-Ausdrücken und beim Anzeigen von Zahlen.
Sign-Erweiterung in MASM-Ausdrücken
Unter bestimmten Bedingungen werden Zahlen automatisch durch die MASM-Ausdrucksauswertung erweitert . Die Signierenerweiterung kann sich nur auf Zahlen von 0x80000000 bis 0xFFFFFFFF auswirken. Das heißt, die Vorzeichenerweiterung wirkt sich nur auf Zahlen aus, die in 32 Bits geschrieben werden können, wobei das hohe Bit gleich 1 ist.
Die Zahl 0x12345678 bleibt immer 12345678 0x00000000, wenn sie vom Debugger als 64-Bit-Zahl behandelt wird. Wenn 0x890ABCDE dagegen als 64-Bit-Wert behandelt wird, bleibt er möglicherweise 0x00000000'890ABCDE, oder die MASM-Ausdrucksauswertung könnte signieren, um ihn auf 0xFFFFFFFF'890ABCDE zu erweitern.
Eine Zahl von 0x80000000 bis 0xFFFFFFFF wird basierend auf den folgenden Kriterien erweitert:
Numerische Konstanten werden im Benutzermodus nie erweitert. Im Kernelmodus wird eine numerische Konstante vor den niedrigen Bytes als Vorzeichen erweitert, es sei denn, sie enthält einen Grave-Akzent ( ` ). Im Kernelmodus werden beispielsweise die Hexadezimalzahlen EEAA1122 und 00000000EEAA1122 erweitert, aber 0000000000 EEAA1122 und 0'EEAA1122 nicht.
Ein 32-Bit-Register wird in beiden Modi erweitert.
Pseudoregister werden immer als 64-Bit-Werte gespeichert. Sie werden bei der Auswertung nicht erweitert. Wenn einem Pseudoregister ein Wert zugewiesen wird, wird der verwendete Ausdruck gemäß den C++-Standardkriterien ausgewertet.
Einzelne Zahlen und Register in einem Ausdruck können erweitert werden, aber keine anderen Berechnungen während der Ausdrucksauswertung werden erweitert. Daher können Sie die hohen Bits einer Zahl maskieren oder registrieren, indem Sie die folgende Syntax verwenden.
( 0x0`FFFFFFFF & expression )
Sign Extension in C++-Ausdrücken
Wenn der Debugger einen C++-Ausdruck auswertet, gelten die folgenden Regeln:
Register und Pseudoregister werden nie erweitert.
Alle anderen Werte werden genau so behandelt, wie C++ Werte ihres Typs behandeln würde.
Anzeigen von Sign-Extended und 64-Bit-Zahlen
Abgesehen von 32-Bit- und 16-Bit-Registern werden alle Zahlen intern im Debugger als 64-Bit-Werte gespeichert. Wenn eine Zahl jedoch bestimmte Kriterien erfüllt, zeigt der Debugger sie in der Befehlsausgabe als 32-Bit-Zahl an.
Der Debugger verwendet die folgenden Kriterien, um zu bestimmen, wie Zahlen angezeigt werden:
Wenn die hohen 32 Bits einer Zahl alle Nullen sind (d. h., wenn die Zahl von 0x00000000'000000000 bis 0x00000000'FFFFFFFF liegt), zeigt der Debugger die Zahl als 32-Bit-Zahl an.
Wenn die hohen 32 Bits einer Zahl alle eins sind und wenn das höchste Bit der niedrigen 32 Bits ebenfalls eins ist (d. h. wenn die Zahl von 0xFFFFFFFF'800000000 bis 0xFFFFFFFF'FFFFFFFF) ist, geht der Debugger davon aus, dass die Zahl eine 32-Bit-Zahl mit vorzeichenweiteren 32-Bits ist, und zeigt sie als 32-Bit-Zahl an.
Wenn die beiden vorherigen Bedingungen nicht zutreffen (d. h. wenn die Zahl von 0x00000001'00000000 bis 0xFFFFFFFF'7FFFFFFF liegt), zeigt der Debugger die Zahl als 64-Bit-Zahl an.
Aufgrund dieser Anzeigeregeln können Sie, wenn eine Zahl als 32-Bit-Zahl von 0x80000000 bis 0xFFFFFFFF angezeigt wird, nicht bestätigen, ob die hohen 32 Bits alle eins oder alle Nullen sind. Um zwischen diesen beiden Fällen zu unterscheiden, müssen Sie eine zusätzliche Berechnung für die Zahl durchführen (z. B. Maskieren eines oder mehrerer der hohen Bits und Anzeigen des Ergebnisses).
Weitere Informationen
MASM-Ausdrücke im Vergleich zu C++-Ausdrücken