Это достаточно быстрый и короткий вариант? Многое зависит от того, где эти числа находятся. В данном случае я предполагаю, что они в байтовом массиве. .data num1 db 1 num2 db 2 .code rdtsc and eax,01h add eax,offset num1 movsx eax,byte ptr [eax] поправить здесь можно лишь так: rdtsc xor al,ah and eax,01h movsx eax,byte ptr [eax+offset num1]
Код (Text): ; code randomize: Push st Call [GetLocalTime] Mov Eax, [st.wSecond] Shl Eax, 16 Add Eax, [st.wMilliseconds] Mov [seed], Eax Ret rnd: Mov Eax, [seed] Mov Ecx, 69621 Mul Ecx Mov Ecx, 0x7fffffff Div Ecx Mov [seed], Edx Ret choice: Call rnd Mov Edx, [seed] And Edx, 1 Mov Eax, [numbers + Edx] Ret ; bss seed rd 1 numbers: rd 1 rd 2 SYSTEMTIME st Вызываешь один раз randomize, а затем choice сколько влезет. P.S. Можно первые пять команд из randomize заменить на rdtsc, как в варианте выше. Кстати, про вариант выше. Если выбор пероидический, то при определённой частоте выбора случайность будет утеряна (чисто теоретически).
Я предполагал передавать числа в ah, al и возвращать там же. Желательно вообще обойтись без операций с памятью. Нужно что-то типа rol ax, cl вот только я торможу как заставить 5 младших бит cl рандомно приходить такими чтоб сдвиг получался кратным 8
bh,bl - числа результат выбора в bl rdtsc shr eax,1 jc @f mov bl,bh @@: 9 байт, против 13 у Black_mirror но выполняется медленнее
А если числа в регистрах EBX,EDX, по можно исп rdtsc dec eax cmovpe ebx,edx Результат в EBX, но работает быстрее предыдущих вариантов
Вобщем рандомизатор что-то получился не очень, вот исходник - может кто хочет поэкспериментировать и предложить лучший. http://cracklab.ru/f/files/1941166798__KeyGen.rar
Вот блин, глупость написал, а внимания никто не обратил. rdtsc записывает результат в пару регистров EDX:EAХ. Короче надо использовать пару EBX,ECX в коде.