Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2015, 19:42   #1
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию Помогите с CPUID

Этот:
Код:
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() и вернуть её значение.

Последний раз редактировалось taras-proger; 26.12.2015 в 19:45.
taras-proger вне форума Ответить с цитированием
Старый 26.12.2015, 20:57   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
CPUID, function 1
feature flags reported in ecx, bit 30: RDRAND
и где ты такой код нарыл? в курсе, что RDRAND нужно вызывать в цикле пока CF не станет 1?

Код:
MOV eax, 1
CPUID

AND ecx, 40000000h
JZ no_rand

genr:
    RDRAND rax
    JNC genr

    RET
no_rand:
    CALL rand
   
    RET

Последний раз редактировалось f.hump; 26.12.2015 в 21:22.
f.hump вне форума Ответить с цитированием
Старый 27.12.2015, 06:48   #3
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
в курсе, что RDRAND нужно вызывать в цикле пока CF не станет 1?
Почему?
Цитата:
CPUID, function 1
А я почему то думал, что ему надо скормить 40000000h. Но теперь он не хочет вперёд переходить, говорит, что undefined reference на метку.

Последний раз редактировалось taras-proger; 27.12.2015 в 06:51.
taras-proger вне форума Ответить с цитированием
Старый 27.12.2015, 09:54   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
The Carry Flag indicates whether a random value is available at the time the instruction is executed. CF=1 indicates that the data in the destination is valid. Software must check the state of CF=1 for determining if a valid random value has been returned, otherwise it is expected to loop and retry execution of RDRAND
Intel® 64 Software Developer’s Manual, Volume 2
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод нужен срочно помогите ) в течение 2 часов от Паскаля на Турбо СИ нужно помогите Жанибек Помощь студентам 14 01.04.2015 17:23
Реализация CPUID в ассемблере на yasm Persepol Помощь студентам 0 27.10.2011 16:43
cpuid VintProg Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 27.08.2011 07:37
Проблема с cpuid Nitrino Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 07.01.2010 02:45