无法在Microsoft VC ++内联ASM中选择位

时间:2012-11-12 22:48:53

标签: c++ visual-c++ inline-assembly

非常简单,真的。我尝试在代码中使用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内联汇编程序中上面显示的方式选择位?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

假设您使用的是0位数字,0是最低有效位,您可以通过右移eax 26位来获得前六位。

在低位位置给出高6位。如果您希望结果位于相同的位位置,只需将and0xfc000000一起使用。

如果我误解了你的位位置,你仍然可以使用shift和按位运算符来得到你想要的东西,尽管这些值(你希望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).