Я думаю, что CPUID фактически забивает EAX, EBX, ECX, EDX, так что, вероятно, это просто проблема с регистрацией мусора.Следующий код работает нормально с gcc 4.0.1 и 4.2.1 в Mac OS X:
#include <stdio.h>
int CPUID_getL1CacheSize()
{
int l1CacheSize = -1;
asm ( "mov $5, %%eax\n\t" // EAX=80000005h: L1 Cache and TLB Identifiers
"cpuid\n\t"
"mov %%eax, %0" // eax into l1CacheSize
: "=r"(l1CacheSize) // output
: // no input
: "%eax", "%ebx", "%ecx", "%edx" // clobbered registers
);
return l1CacheSize;
}
int main(void)
{
printf("CPUID_getL1CacheSize = %d\n", CPUID_getL1CacheSize());
return 0;
}
Обратите внимание, что вам нужно скомпилировать с -fno-pic
, так как EBX зарезервирован, когда включен PIC.(Либо это, либо вам нужно предпринять шаги для сохранения и восстановления EBX).
$ gcc-4.0 -Wall -fno-pic cpuid2.c -o cpuid2
$ ./cpuid2
CPUID_getL1CacheSize = 64
$ gcc-4.2 -Wall -fno-pic cpuid2.c -o cpuid2
$ ./cpuid2
CPUID_getL1CacheSize = 64
$