Генератор xoshiro64 на Ассемблере
19.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В качестве продолжения статьи про xoshiro128 реализация алгоритма xoshiro64 на Ассемблере. Напомню, что xoshiro (xoroshiro) - семейство высокоскоростных алгоритмов для генерации псевдослучайных чисел. Есть две разновидности xoshiro64, отличающиеся друг от друга только количеством операций умножения. Это, соответственно, версия xoshiro64* и xoshiro64**. Для работы генератор использует буфер размером в 2 DWORD'а.В оригинальном алгоритме отсутствует функция инициализации, там достаточно просто записать какие-то начальные ненулевые значения в рабочий буфер. Если вам надо инициализировать и "прогреть" генератор, то я сделал для этого функцию по аналогии с xoshiro128. Но это уже моя самодеятельность, в авторском алгоритме ничего такого нет.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall long_jump,seed
- ;---------------------------------------------
- proc long_jump seed:DWORD
- locals
- s0 dd ?
- s1 dd ?
- endl
- pusha
- ; Начальное "засеивание" генератора
- mov edi,s
- mov eax,[seed]
- rol eax,1
- xor eax,0x1C580662
- stosd
- rol eax,3
- add eax,0x0B6F099F
- stosd
- ; Холостая прокрутка генератора для инициализации
- lea edi,[s0]
- push edi
- xor eax,eax
- stosd
- stosd
- xor ebx,ebx
- .loc_for_1:
- xor ecx,ecx
- .loc_for_2:
- mov eax,[.lj+ebx*4]
- and eax,1
- shl eax,cl
- jz @f
- mov esi,s
- lodsd
- xor [s0],eax
- lodsd
- xor [s1],eax
- @@:
- stdcall next
- inc ecx
- cmp ecx,32
- jb .loc_for_2
- inc ebx
- jnp .loc_for_1
- pop esi
- mov edi,s
- movsd
- movsd
- popa
- ret
- .lj: dd 0xB523952E
- dd 0x0B6F099F
- endp
Читать статью целиком »
Просмотров: 784 | Комментариев: 4