Помогите с CPUID

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Этот:

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

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() и вернуть её значение.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

После вызова CPUID с параметром 1 в регистре ECX бит 30 будет указывать на поддержку инструкции RDRAND.
В документации сказано, что если передать в EAX = 0 , и вызвать CPUID, то обратно туда прилетит кол-во поддерживаемых функций (т.е. какое максимальное число можно передать в EAX перед вызовом)
It's a long way to the top if you wanna rock'n'roll
Ответить