5

多くのインターネット調査の後、cpuidを使用してCPUのL1キャッシュサイズを取得するために、C++プログラムに小さなアセンブラルーチンを実装しました。

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"              // clobbered register
         );

    return l1CacheSize;
}

MinGW(GCC、G ++)を搭載したWindows764ビットで完全に動作します。次に、GCC 4.0を使用してMacコンピューターでこれを試しましたが、プログラムがComboBoxesに奇妙な文字列を表示し、一部の信号を接続できないため、どこかにエラーがあるはずです(QtGUI)。

これは私の最初のアセンブラプログラムです。誰かが私にヒントをくれることを願っています、ありがとう!

4

2 に答える 2

5

I think that CPUID actually clobbers EAX, EBX, ECX, EDX, so it's probably just a register trashing problem. The following code appears to work OK with gcc 4.0.1 and 4.2.1 on 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;
}

Note that you need to compile with -fno-pic as EBX is reserved when PIC is enabled. (Either that or you need to take steps to save and restore 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
$ 
于 2010-06-24T21:37:36.123 に答える
0

私は最終的に問題を解決しました。遊んでいるときにコンパイラ エラーが発生しました:「エラー: PIC レジスタ '%ebx' が 'asm' で上書きされました」。インターネットで調査した後、コードを次のように変更しました。

int CPUID_getL1CacheSize() {

int l1CacheSize = -1;

asm volatile ( "mov $5, %%eax\n\t"
               "pushl %%ebx; cpuid; popl %%ebx\n\t"
               "mov %%eax, %0"
               : "=r"(l1CacheSize)
               :
               : "%eax"
               );

return l1CacheSize;

}

Paul に感謝します。コンパイラ オプション -fno-pic も優れたソリューションです。ご挨拶

于 2010-06-24T22:04:57.580 に答える