2

C++でアセンブラを使ってCPUIDを読み取ろうとしました。に関数があることは知っていますが、asmの方法が必要です。そのため、CPUID が実行された後、eax、ebx、ecx レジスタに ASCII コード文字列を入力する必要があります。しかし、私の問題は、asm アドレスでフルまたはハーフ eax レジスタしかできないため、その 32 ビットを 4 バイトに分割する方法です。私はこれを使用しました:

#include <iostream>
#include <stdlib.h>

int main()
{
_asm
{
cpuid
/*There I need to mov values from eax,ebx and ecx to some propriate variables*/
}
system("PAUSE");
return(0);  
}
4

2 に答える 2

2

Linux カーネル ソースは、インライン アセンブリを使用して x86 cpuid を実行する方法を示しています。構文は GCC 固有です。Windows を使用している場合、これはおそらく役に立ちません。

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
                                unsigned int *ecx, unsigned int *edx)
{
        /* ecx is often an input as well as an output. */
        asm volatile("cpuid"
            : "=a" (*eax),
              "=b" (*ebx),
              "=c" (*ecx),
              "=d" (*edx)
            : "0" (*eax), "2" (*ecx));
}

この形式の関数を作成すると (EAX、ECX は入力であり、4 つすべてが出力であることに注意してください)、呼び出し元の個々のビット/バイトを簡単に分割できます。

于 2010-03-10T21:11:03.300 に答える
0

とにかく提供された関数を使用しない理由がわかりません

于 2010-03-10T21:22:22.917 に答える