真的很简单。我尝试在我的代码中使用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的内联汇编器中显示的方式选择位?我想念什么吗?

最佳答案

假设您使用的是基于0的位数,而0是最低有效位,则只需将eax右移26位就可以得到前6位。

这样就可以在低位位置获得高六位。如果您希望结果在相同的位位置,只需使用and对其进行0xfc000000即可。

如果我误解了您的位位置,尽管值(您要使用and或shift by)可能会有所不同,但您仍然可以使用shift和按位运算符来获取所需的内容。

根据您的评论:



获取核数的方法如下:

...                  ; 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).

关于c++ - 无法选择Microsoft VC++嵌入式ASM中的位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13352881/

10-13 09:02