真的很简单。我尝试在我的代码中使用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/