2016-06-14 15 views
5

Mam skompilowaną aplikację do korzystania z zestawu instrukcji x86, ale muszę wiedzieć programowo, czy komputer, na którym działa plik wykonywalny, obsługuje zestaw instrukcji amd64, czy nie. Czy istnieje prosty sposób, aby to znaleźć (ewentualnie przy użyciu CPUID)?Wykrywanie, czy system może uruchamiać pliki wykonywalne amd64

Aplikacja musi działać w wielu systemach, dlatego preferowane są metody inne niż oparte na systemie operacyjnym.

+0

[This] (http://stackoverflow.com/a/7495023/4342498) może załatwić sprawę. – NathanOliver

+1

To tylko mówi mi, do jakiej architektury został skompilowany kod, a nie tryb runtime kodu – doron

+1

@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

Odpowiedz

4

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() 
+0

dowolny przykładowy kod będzie użyteczny – doron

+0

Niestety: do tego doszedłem! I musiałem przetestować to działa ... Jaki kompilator (i/lub asembler) używasz? –

+0

Prawdopodobnie użyje nierozłącznego kompilatora. Ale dzięki, powinno mi być wystarczająco dużo informacji, aby zacząć. – doron

Powiązane problemy