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 位即可获得前六位。

这为您提供了低位位置的高六位。如果您希望结果位于相同的位位置,只需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 回答