2016-06-14 4 views
5

Ich habe meine Anwendung für die Verwendung des x86-Befehlssatzes kompiliert, aber ich muss wissen, ob der Computer, auf dem die ausführbare Datei läuft, den Befehlssatz amd64 unterstützt oder nicht. Gibt es einen einfachen Weg, dies herauszufinden (möglicherweise mit CPUID)?Ermitteln, ob das System ausführbare Dateien amd64 ausführen kann

Die Anwendung muss auf mehreren Betriebssystemen ausgeführt werden können, daher werden nicht auf dem Betriebssystem basierende Methoden bevorzugt.

+0

[Dies] (http://stackoverflow.com/a/7495023/4342498) kann den Trick für Sie tun. – NathanOliver

+1

Das sagt mir nur, welche Architektur der Code kompiliert wurde, nicht der Laufzeitmodus des Codes – doron

+1

@doron: Wenn es für x86 kompiliert wurde, wird es keine 64-Bit-Anweisungen verwenden und wenn für x64 kompiliert kann es nicht auf x86 laufen. Ihre Frage sieht wie ein XY-Problem aus, was ist Ihr Ziel? – Olaf

Antwort

4

Sie suchen nach Code, um Long mode zu erkennen.

Ein Bit im erweiterten Attributfeld der CPUID informiert Programme im Real- oder Protected-Modus, wenn der Prozessor in den Long-Modus wechseln kann. Dadurch kann ein Programm einen x86-64-Prozessor erkennen. Dies ähnelt dem CPUID-Attributen, das Intel IA-64-Prozessoren verwenden, damit Programme erkennen können, ob sie unter IA-32-Emulation ausgeführt werden.

Das fragliche Flag ist Bit 29 in EDX der CPUID query for 80000001h.

Die Anweisungsinfrastruktur CPUID ist ein wenig longwinded: wenn Sie vermuten, dass CPUID sogar verfügbar ist, müssen Sie dann abfragen, was es tatsächlich unterstützen kann, bevor es in genau diese Abfrage startet. Und dann müssen Sie die Registerergebnisse in Ihre Variable bringen.


Hier ist ein Code, geschrieben in Inline-Assembler für C/C++. Wenn du gcc benutzt, sorry: du musst selbst zur (grauenhaften!) Gasmsyntax konvertieren!

// Only on Pentium4 or above 
// Only available on 32-bit 
bool HasLongMode() { 
    __asm { 
     mov eax,0x80000001 // Ask for processor features 
     cpuid    // from the CPU 
     xor eax,eax  // Zero return value 
     test edx,0x20000000 // Check relevant bit 
     setnz al    // Was bit set? 
    } // __asm 
} // HasLongMode() 
+0

jeder Beispielcode wird nützlich sein – doron

+0

Sorry: Ich war dabei! Und ich musste testen, ob es funktioniert hat ... Welchen Compiler (und/oder Assembler) verwendest du überhaupt? –

+0

Wird wahrscheinlich Compiler-Intrinsik verwenden. Aber danke, es sollte genügend Informationen geben, damit ich anfangen kann. – doron

Verwandte Themen