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()
fonte
2016-06-14 11:43:14
[Questo] (http://stackoverflow.com/a/7495023/4342498) può fare il trucco per voi. – NathanOliver
Questo mi dice solo per quale architettura è stato compilato il codice, non la modalità di runtime del codice – doron
@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