非常简单,真的。我尝试在代码中使用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 :(得分:3)
假设您使用的是0位数字,0是最低有效位,您可以通过右移eax
26位来获得前六位。
在低位位置给出高6位。如果您希望结果位于相同的位位置,只需将and
与0xfc000000
一起使用。
如果我误解了你的位位置,你仍然可以使用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).