Intel x86-64 XSAVE / XRSTOR

8

Ich bin ein CS Student, der eine Intel x86-64 Assembly schreibt, mit nasm kompiliert und auf einem Core i7 Prozessor mit Ubuntu 12.04 als Gastbetriebssystem läuft. Hat jemand ein Beispiel dafür, wie man XSAVE und XRSTOR benutzt? Ich habe den Abschnitt über XSAVE in Intel Architectures Software Developers Handbuch mehrmals gelesen. Ich habe versucht, xsave in C ++ zu implementieren und dann die Binärdatei zu disassemblieren, um zu verstehen, was sie macht. Und natürlich habe ich das Internet nach Beispielen durchforstet. Irgendwelche Vorschläge wären sehr verpflichtet.

    
codepoetchris 28.02.2014, 20:32
quelle

2 Antworten

6

Endlich eine Antwort auf diese Frage. Danke an den Benutzer: Harold, der mir geholfen hat, die Frage zu beantworten. Eine Zusammenfassung dessen, was ich gefunden habe:

Richten Sie in .data einen Speicherplatz ein, und richten Sie ihn an einer 64-Byte-Grenze aus. Dann können Sie die Befehle mit diesem Speicherplatz verwenden. Wenn Sie den Stack verwenden möchten, sollten Sie dies in ähnlicher Weise sicherstellen können, indem Sie sicherstellen, dass der Stack 64 Byte ausgerichtet ist. Dieser Weg erscheint mir jedoch zu diesem Zweck einfacher.

eax: edx wird verwendet, um die Flags der Register zu setzen, die Sie speichern, wiederherstellen möchten. Diese Kombination besteht aus 64 Bits und ist mit einer internen Steuerung UND-verknüpft, die weiß, welche Register Sie speichern / wiederherstellen können (dies erlaubt Prozessoren, die z. B. diese Register nicht ignorieren). Ich finde es am einfachsten, alle Bits ein- und auszuschalten alles speichern / wiederherstellen:

segment .data %Vor%

segment .text

%Vor%     
C_Rod 23.03.2014, 15:55
quelle
3

Die Anweisungen xsave / xrstor / xsaveopt werden verwendet, um eine vollständige Sicherung / Wiederherstellung des erweiterten Zustands im Prozessor zum / vom Speicher auszuführen. Ähnlich wie fxsave / fxrstor speichert / stellt es den fpu-Status st[0..7] , xmm[0..7] , mxcsr usw. wieder her und unterstützt zusätzlich ymm[0..15] und zukünftige Erweiterungen ( zmm[0..31] ). Die gespeicherten tatsächlichen Werte und das Datenlayout werden über die entsprechenden cpuid -Blätter aufgelistet. Die Verwendung ist in der Regel Betriebssystem Kontextwechsel . Die Programmierer-Referenz beschreibt, wie sie korrekt verwendet werden.

Für das allgemeine Speichern / Wiederherstellen von Benutzerbereichsregistern verfügt der Assembler normalerweise über eine Funktion zum Speichern / Wiederherstellen einer Gruppe von Registern.

Zum Beispiel ...

masm

%Vor%

yasm

%Vor%


%Vor%

In ia-32 gibt es pushad , um alle allgemeinen Register zu speichern, aber mit amd64 müssen Sie die entsprechenden push / pop -Paare für jedes der von Ihnen verwendeten Register haben.

    
Jason 06.03.2014 23:05
quelle

Tags und Links