Помогите с CPUID

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

Модератор: Andy

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

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

26 дек 2015, 22:21

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