Генератор XorShift128 на Ассемблере
Генератор XorShift128 на Ассемблере
Генератор случайных чисел XorShift128 напоминает уже известное вам семейство генераторов xoshiro128. Из названия понятно, что тут используются только команда XOR и сдвиговые команды SHL/SHR, а период равняется 2128-1. В алгоритме отсутствуют операции деления и умножения, поэтому его можно использовать в тех микроконтроллерах, где таких ассемблерных операций нет в принципе. Также генератор XorShift является одними из самых быстрых генераторов случайных чисел.
Для работы генератора потребуется буфер в памяти размером 128 бит.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Данные для генератора случайных чисел
- s rd 4
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall xorshift_init,seed
- ;---------------------------------------------
- proc xorshift_init seed:DWORD
- locals
- s0 dd ?
- s1 dd ?
- s2 dd ?
- s3 dd ?
- endl
- pusha
- ; Начальное "засеивание" генератора
- mov edi,s
- mov eax,[seed]
- rol eax,1
- xor eax,0x1C580662
- stosd
- rol eax,3
- add eax,0x0B6F099F
- stosd
- rol eax,5
- xor eax,0xB523952E
- stosd
- rol eax,7
- sub eax,0xCCF5A0EF
- stosd
- ; Холостая прокрутка генератора для инициализации
- lea edi,[s0]
- push edi
- xor eax,eax
- stosd
- stosd
- 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
- lodsd
- xor [s2],eax
- lodsd
- xor [s3],eax
- @@:
- stdcall xorshift
- inc ecx
- cmp ecx,32
- jb .loc_for_2
- inc ebx
- cmp ebx,4
- jb .loc_for_1
- pop esi
- mov edi,s
- movsd
- movsd
- movsd
- movsd
- popa
- ret
- .lj: dd 0xB523952E
- dd 0x0B6F099F
- dd 0xCCF5A0EF
- dd 0x1C580662
- endp
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Инициализация генератора случайных чисел
- ; stdcall xorshift_init,seed
- ;---------------------------------------------
- proc xorshift_init seed:DWORD
- pusha
- ; Начальное "засеивание" генератора
- mov edi,s
- mov eax,[seed]
- rol eax,1
- xor eax,0x1C580662
- stosd
- rol eax,3
- add eax,0x0B6F099F
- stosd
- rol eax,5
- xor eax,0xB523952E
- stosd
- rol eax,7
- sub eax,0xCCF5A0EF
- stosd
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; Получить случайное число
- ; stdcall xorshift
- ; на выходе EAX - случайное число
- ;---------------------------------------------
- proc xorshift
- pusha
- mov eax,[s+0*4]
- mov ecx,eax
- shl eax,11
- xor ecx,eax
- mov eax,[s+1*4]
- mov [s+0*4],eax
- mov eax,[s+2*4]
- mov [s+1*4],eax
- mov eax,[s+3*4]
- mov [s+2*4],eax
- mov eax,ecx
- shr eax,8
- xor ecx,eax
- mov eax,[s+3*4]
- mov ebx,eax
- shr eax,19
- xor ebx,eax
- xor ebx,ecx
- mov [s+3*4],ebx
- mov [esp+28],ebx
- popa
- ret
- endp
В приложении пример программы с исходным текстом, которая генерирует псевдослучайные числа по алгоритму XorShift128.
Просмотров: 991 | Комментариев: 0
Метки: Assembler, генератор ПСЧ
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария