2015-07-03 6 views
7

I CLR-Code in der Montage wurde das Debuggen, und bekam auf eine LinieWas bedeutet qword ptr [hexvalue] ohne Base bedeuten registrieren

mov rax, qword ptr [ff4053c0h] 

Ich denke qword ptr [ff4053c0h] auf eine Zeichenkette bezieht sich in Ich bin interessiert, aber ff4053c0h ist kein gültiger Speicherort. Lesen über qword ptr es scheint, eine Adresse basierend auf einem Basisregister (z. B. qword ptr [rsp+30h] ist 30 Bytes in den Stapel) zu verweisen, aber ich kann nicht finden, was es bedeutet, ohne Basisregister.

+0

Es bezieht sich auf die Adresse, auf die "ff4053c0h" als Vierfachwort (64 Bit) zeigt. Welcher 64-Bit-Wert an dieser Adresse ist, wird in 'rax' geladen. Wenn die Adresse nicht gültig ist, liegt ein Problem vor. Sind Sie sicher, dass es nicht gültig ist? – lurker

Antwort

7

Wenn kein Basisregister vorgesehen ist, bedeutet dies, data segment (http://www.osdata.com/system/physical/memory.htm). In Ihrem Code bedeutet mov rax, qword ptr [ff4053c0h] "nehmen Sie 8 Bytes vom Datensegment Offset FF4053C0h und setzen Sie sie in RAX".

Wie Sie richtig zeigen, zeigt das Vorhandensein eines Basisregisters wie rsp deutlich Stapelsegment an. In Ihrem Fall bedeutet kein Basisregister ein Datensegment.

Jetzt, über die große Zahl "FF4053C0h", die "4 282 405 824" ist, ist es möglich, 4 GB adressierbaren Speicher (http://wiki.osdev.org/Protected_Mode), die bestätigt, dass Ihre Codezeile gültig sein kann und Zugriff auf Offset FF4053C0h in einem riesigen Datensegment (http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html).

Eine andere Quelle = Assembly: Using the Data Segment Register (DS).

+0

Ich sagte, die Adresse war ungültig, denn wenn ich es im Speicherfenster im Visual Studio-Debugger suchen, zeigte es nicht zugeordneten Speicher (?? statt Inhalt). Das Speicherfenster sollte standardmäßig ein Datensegment anzeigen. Daher bin ich mir nicht sicher, was ich vermisse. Ich werde es später noch einmal überprüfen. – Rattle

+0

@Rattle, das Betriebssystem könnte den Speicher vor dem Zugriff anderer Prozesse schützen, so dass diese Prozesse den geschützten Speicher nicht sehen können. –

5

Ohne die Dinge, ohne guten Grund zu verkomplizieren:

Es bedeutet, dass ein 64-Bit-Wert von der Adresse 0ff4053c0h in das Register RAX gelesen wird.

Die Adresse muss gültig sein, erneut prüfen.
Die QWORD PTR ist nur eine Größenangabe (hier überflüssig, aber es verbessert die Lesbarkeit), es ist nicht mit einem Basisregister verbunden.

Wenn Sie wirklich an den verschiedenen Adressierungsmodi der CPU interessiert sind, können Sie die Intel-Handbücher (Google das) lesen.

0

Sie verschieben einen 64-Bit-Wert aus dem Speicher in das Rax-Register. Der Wert wird von der Adresse ff4053c0h gelesen. qword ptr ist ein Hinweis für den Assembler, um einen Move-Op-Code (Maschinencode) unter Verwendung einer 64-Bit-Konstantenadresse zu erzeugen. Der angegebene Wert ist ein 32-Bit-Wert (8 Hexadezimalziffern => 8 Mal eine Hexadezimalzahl/Buchstabe => 8 * 4 Bit => 32 Bit).

Es gibt Mov Op-Codes, die 32-Bit-Operationen unterstützen, aber (höchstwahrscheinlich überprüfen Sie die Spezifikationen für die CPU/Modus) nicht zum Laden von Speicher in ein 64-Bit-Register. Also wird qword benötigt, um sicherzustellen, dass der Assembler wirklich eine 64-Bit-Adresse ausdrückt.

Für Ihren Kommentar über die Adresse auf undefinierten Speicher (siehe Kommentare für angenommene Antwort), verstehen Sie, dass heutzutage jedem Prozess eine virtuelle Speichertabelle zugewiesen ist. Der virtuelle Speicher bildet im Wesentlichen eine logische Adresse auf eine Adresse im realen Speicher ab. Es verhindert, dass Prozesse Speicher sehen und ändern, der nicht zum Prozess gehört, und bietet somit einem laufenden System eine hohe Stabilität.

Mit zwei Prozessen, die beide einen Teil des Speichers teilen, ist es möglich, dass jeder einzelne Prozess den gleichen physischen Speicher unter verschiedenen logischen Adressen sieht. Das Betriebssystem entscheidet, wie der virtuelle Speicher jedes Prozesses aussieht.

Das Mapping wird auf Seiten pro Ebene (z. B. Seite = 4 KB) bereitgestellt, und der Prozessor führt die eigentliche Zuordnung intern durch.

Dieses Konzept ist sehr wahr für die Zuordnung von Dateien zum Speicher und die gemeinsame Nutzung des Speichers zwischen verschiedenen Prozessen. Auf diese Weise können Sie eine 2-GB-Datei in den Speicher ablegen und 10 Prozesse gleichzeitig mit der gleichen zugeordneten Datei ausführen, während nur (maximal) 2 GB tatsächlicher Speicher verbraucht werden. Es ist die Art und Weise, wie Datei-IO-Caching hauptsächlich auf Betriebssystemebene durchgeführt wird.

Verwandte Themen