Невозможно выбрать биты в Microsoft VC ++ Inline ASM

Все очень просто. Я пытался использовать 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-битные числа с 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).
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]