Szukasz kodu do wykrycia Long mode.
Trochę w polu atrybutów rozszerzonych CPUID informuje programy w trybie rzeczywistym lub chronionym, jeśli procesor może przejść do trybu długiego, co pozwala programowi wykryć procesor x86-64. Jest to podobne do bitów atrybutów CPUID używanych przez procesory Intel IA-64 w celu umożliwienia programom wykrycia, czy działają one w emulacji IA-32.
Flaga, o której mowa, jest nieco 29 w EDX
z CPUID
query for 80000001h
.
Infrastruktura instruktażowa CPUID
jest trochę długotrwała: jeśli założysz, że CPUID
jest jeszcze dostępna, musisz zapytać, co może faktycznie obsługiwać, zanim uruchomisz to dokładne zapytanie. A następnie musisz uzyskać wyniki rejestru w swojej zmiennej.
Oto kod napisany w asemblerach liniowych dla C/C++. Jeśli używasz gcc, przepraszam: będziesz musiał sam dokonać konwersji na składnię gazu (strasznego!)!
// 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()
[This] (http://stackoverflow.com/a/7495023/4342498) może załatwić sprawę. – NathanOliver
To tylko mówi mi, do jakiej architektury został skompilowany kod, a nie tryb runtime kodu – doron
@doron: Jeśli został skompilowany dla x86, nie będzie używać instrukcji 64-bitowych, a gdy skompilowany dla x64, nie będzie mógł działać na x86. Twoje pytanie wygląda jak problem XY, jaki jest twój cel? – Olaf