3

C++ で CPUID を使用して情報にアクセスしようとしています。私はこれまでこのコードを作成してきましたが、これ以上進めることはできませんでした。ここやウェブで役立つ記事をいくつか見つけましたが、役に立たなかったようです。

x88 の命令とレジスタのみを使用することになっています。これがコードです。

int b[5] = {0} ;

for (int a = 0; a < 5 ; a++)
{
    __cpuid (b,a) ;
    std::cout << "The code " << a << " gives " << b[0] << std::endl;
}

この配列から情報をビット単位でフェッチする方法が理解できないため、これ以上先に進むことができません。スキームを説明するこのwikimsdnの記事があります。私の質問はあまり良くありませんが、この点に関して助けや指示をいただければ幸いです。

4

1 に答える 1

1

あなたの問題は、すでに行ったように、インデックスを介して配列データにアクセスすることではないと思いb[0]ますb[1]。ちょっとした (!) 操作が必要です。興味のないビットをマスクして、残っているものを解釈する必要があります。例えば

    (b[0] & 0xF0) >> 4

MSDN によるモデルである 4 ビット (4-7) を提供します。等々。次のことを考慮してください

    3            2            1
    1098 7654 3210 9876 5432 1098 7654 3210
    0000 0000 0000 0000 0000 0000 0000 0000 
    \R_/ \ext_Fam/ \eM/ RRpp \fm/ \md/ \sd/

    R = reserved
    ext_Fam = extended family
    eM = extended model
    pp = processor type
    fm = family
    md = model
    sd = stepping id

(int は 32 ビット int またはそれ以上)

たとえば、プロセッサの種類が必要な場合は、次のものが必要です。

    0000 0000 0000 0000 0011 0000 0000 0000 
    \R_/ \ext_Fam/ \eM/ RRpp \fm/ \md/ \sd/

次に、3 つの「ニブル」 (12) の右にシフト (論理シフト) します。そう

   (b[0] >> 12) & 3

プロセッサの種類を表す数値が表示されます。(数値 3 は基数 2 の 11 であるため、右端の 2 ビットのみを選択するのが正しいマスクです)。

于 2012-11-03T18:37:37.263 に答える