Все очень просто. Я пытался использовать 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 бит
Это дает вам верхние шесть битов в нижних битовых позициях. Если вы хотите, чтобы результат в так же битовые позиции, просто 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).
Других решений пока нет …