1

本当に簡単です。コードで使用しようとしたところEAX[31:26]、次のエラーが表示されました。

error C2400: inline assembler syntax error in 'second operand'; found ':'

そして、ここに私のコードがあります:

unsigned _EAX, _EBX, _ECX, _EDX ;
//LoadCPUID(EAX_CACHECONFIG, _EAX, _EBX, _ECX, _EDX);

__asm {
    mov EAX, EAX_CACHECONFIG ;
    mov ECX, 0x00000001 ;
    cpuid ;
    mov _EAX, EAX[31:26] ;
}

return _EAX;

MSVC のインライン アセンブラで、上記の方法でビットを選択することはできますか? 何か不足していますか?

4

1 に答える 1

3

0ベースのビット番号を使用していて、0が最下位ビットであるとすると、eax26ビットを右シフトするだけで上位6ビットを取得できます。

これにより、下位ビット位置の上位6ビットが得られます。同じビット位置で結果が必要な場合は、単に。andを使用し0xfc000000ます。

私があなたのビット位置を誤解した場合でも、シフトとビット演算子を使用して必要なものを取得できますが、値(使用したい値andまたはシフトした値)は異なる場合があります。

あなたのコメントに基づく:

CPUID命令を実行した後、(EAX [31:26] + 1)にはコアの数が含まれます。

コアの数を取得する方法は次のとおりです。

...                  ; load up cpuid registers first
cpuid
shr    eax, 26       ; move bits 31:26 down to 5:0
inc    eax
...                  ; eax now contains the core count (1 thru 64).
于 2012-11-12T23:12:59.240 に答える