2016-06-14 63 views
5

Ho compilato la mia applicazione per utilizzare il set di istruzioni x86 ma ho bisogno di sapere a livello di programma se la macchina su cui è in esecuzione l'eseguibile supporta il set di istruzioni amd64 o meno. C'è un modo semplice per scoprirlo (possibilmente usando CPUID)?Rileva se il sistema può eseguire eseguibili amd64

L'applicazione deve essere in grado di essere eseguita su più SO in modo da preferire metodi non basati su OS.

+0

[Questo] (http://stackoverflow.com/a/7495023/4342498) può fare il trucco per voi. – NathanOliver

+1

Questo mi dice solo per quale architettura è stato compilato il codice, non la modalità di runtime del codice – doron

+1

@doron: Se è stato compilato per x86 non utilizzerà le istruzioni a 64 bit e quando compilato per x64 non può essere eseguito su x86. La tua domanda sembra un problema XY, qual è il tuo obiettivo? – Olaf

risposta

4

Stai cercando il codice per rilevare Long mode.

Un bit nel campo degli attributi estesi CPUID informa i programmi in modalità reali o protette se il processore può passare alla modalità lunga, che consente a un programma di rilevare un processore x86-64. Questo è simile al bit di attributi CPUID utilizzato dai processori Intel IA-64 per consentire ai programmi di rilevare se sono in esecuzione con l'emulazione IA-32.

Il flag in questione è il bit 29 in EDX dello CPUID query for 80000001h.

L'infrastruttura di istruzioni CPUID è un po 'troppo lunga: se si presume che CPUID sia ancora disponibile, è necessario interrogare ciò che può effettivamente supportare prima di avviarsi in quella query esatta. E poi hai bisogno di ottenere i risultati del registro nella tua variabile.


Ecco un codice, scritto in assembler inline per C/C++. Se stai usando gcc, mi dispiace: dovrai convertirti alla (orribile!) Sintassi gasm da solo!

// 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

qualsiasi codice di esempio sarà utile – doron

+0

Spiacente: ci stavo arrivando! E avevo bisogno di testarlo ha funzionato ... Che compilatore (e/o assemblatore) stai usando comunque? –

+0

Probabilmente userà i dati intrinseci del compilatore. Ma grazie, ci dovrebbero essere abbastanza informazioni per farmi andare. – doron