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()
[Dies] (http://stackoverflow.com/a/7495023/4342498) kann den Trick für Sie tun. – NathanOliver
Das sagt mir nur, welche Architektur der Code kompiliert wurde, nicht der Laufzeitmodus des Codes – doron
@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