Страница 1 из 1

Помогите с CPUID

Добавлено: 26 дек 2015, 19:35
Сионист
Этот:

Код: Выделить всё

unsigned long long int IntellRandom ()
{
 unsigned long long int Result;
  asm (
       "PUSH %%RAX\n\
        MOV $0, %%RAX\n\
        RDRAND %%RAX\n\
        MOV %%RAX, %0\n\
        POP %%RAX":: "m"(Result)
      );
  return Result;
}
код работает. Но если EAX присвоить 0 и выполнить CPUID, то в EAX почему то 11. Как защитить эту функцию от исполнения на процессоре, не поддерживающем RDRAND? Компилятор MinGW, среда Code Blocks. Если процессор не поддерживает RDRAND инструкцию, то функция должна вызвать rand() и вернуть её значение.

Re: Помогите с CPUID

Добавлено: 26 дек 2015, 22:21
somewhere
После вызова CPUID с параметром 1 в регистре ECX бит 30 будет указывать на поддержку инструкции RDRAND.
В документации сказано, что если передать в EAX = 0 , и вызвать CPUID, то обратно туда прилетит кол-во поддерживаемых функций (т.е. какое максимальное число можно передать в EAX перед вызовом)