Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Генератор XorShift128 на Ассемблере

09.06.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Генератор XorShift128 на Ассемблере

Генератор случайных чисел XorShift128 напоминает уже известное вам семейство генераторов xoshiro128. Из названия понятно, что тут используются только команда XOR и сдвиговые команды SHL/SHR, а период равняется 2128-1. В алгоритме отсутствуют операции деления и умножения, поэтому его можно использовать в тех микроконтроллерах, где таких ассемблерных операций нет в принципе. Также генератор XorShift является одними из самых быстрых генераторов случайных чисел.

Читать статью целиком »
Просмотров: 984 | Комментариев: 0

Генератор xoshiro64 на Ассемблере

19.08.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В качестве продолжения статьи про xoshiro128 реализация алгоритма xoshiro64 на Ассемблере. Напомню, что xoshiro (xoroshiro) - семейство высокоскоростных алгоритмов для генерации псевдослучайных чисел. Есть две разновидности xoshiro64, отличающиеся друг от друга только количеством операций умножения. Это, соответственно, версия xoshiro64* и xoshiro64**. Для работы генератор использует буфер размером в 2 DWORD'а.

В оригинальном алгоритме отсутствует функция инициализации, там достаточно просто записать какие-то начальные ненулевые значения в рабочий буфер. Если вам надо инициализировать и "прогреть" генератор, то я сделал для этого функцию по аналогии с xoshiro128. Но это уже моя самодеятельность, в авторском алгоритме ничего такого нет.
  1. ;---------------------------------------------
  2. ; Инициализация генератора случайных чисел
  3. ; stdcall long_jump,seed
  4. ;---------------------------------------------
  5. proc long_jump seed:DWORD
  6.         locals
  7.              s0 dd ?
  8.              s1 dd ?
  9.         endl
  10.  
  11.         pusha
  12.  
  13.         ; Начальное "засеивание" генератора
  14.         mov     edi,s
  15.         mov     eax,[seed]
  16.         rol     eax,1
  17.         xor     eax,0x1C580662
  18.         stosd
  19.         rol     eax,3
  20.         add     eax,0x0B6F099F
  21.         stosd
  22.  
  23.         ; Холостая прокрутка генератора для инициализации
  24.         lea     edi,[s0]
  25.         push    edi
  26.         xor     eax,eax
  27.         stosd
  28.         stosd
  29.  
  30.         xor     ebx,ebx
  31. .loc_for_1:
  32.         xor     ecx,ecx
  33. .loc_for_2:
  34.         mov     eax,[.lj+ebx*4]
  35.         and     eax,1
  36.         shl     eax,cl
  37.         jz      @f
  38.  
  39.         mov     esi,s
  40.         lodsd
  41.         xor     [s0],eax
  42.         lodsd
  43.         xor     [s1],eax
  44. @@:
  45.         stdcall next
  46.  
  47.         inc     ecx
  48.         cmp     ecx,32
  49.         jb      .loc_for_2
  50.  
  51.         inc     ebx
  52.         jnp     .loc_for_1
  53.  
  54.         pop     esi
  55.         mov     edi,s
  56.         movsd
  57.         movsd
  58.  
  59.         popa
  60.         ret
  61.  
  62. .lj:    dd 0xB523952E
  63.         dd 0x0B6F099F
  64. endp
Инициализация выполняет первичное "засеивание" рабочего буфера, а затем делает 264 холостых прогонов генератора с одновременным перемешиванием данных рабочего буфера.

Читать статью целиком »
Просмотров: 893 | Комментариев: 4

Системные генераторы случайных чисел

13.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

Системные генераторы случайных чисел

На сайте уже выложено несколько различных алгоритмов генераторов псевдослучайных чисел. Какие-то генераторы лучше, какие-то похуже. Но когда надо сгенерировать всего пару-тройку чисел или результаты генерации не используются в критических участках кода, можно воспользоваться системными источниками псевдослучайных чисел.

Читать статью целиком »
Просмотров: 2230 | Комментариев: 26

Генератор xoshiro128 на Ассемблере

05.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Семейство xoshiro (xoroshiro) - это высокоскоростные и очень эффективные алгоритмы генерации псевдослучайных чисел общего назначения с хорошим распределением. Свое название генераторы получили от используемых в них операций XOR/Shift/Rotate. Разные варианты генераторов используют для рабочего буфера разные объемы памяти, а также реализованы как в 64-битной, так и в 32-битной версии. У меня тут будет 32-битный вариант xoshiro128 с периодом 2128.

На всякий случай сразу уточню, что если в тексте встречается термин "случайное число", то имеется в виду "псевдослучайное число". У любого алгоритма генерации все равно есть зависимость и период, пусть даже очень большой, а создавать истинно случайные числа они не в состоянии.

Переходим к программированию. Как можно догадаться из суффикса названия, для работы генератора потребуется 128 бит, то есть 4 DWORD'а.
  1. ;---------------------------------------------
  2. ; Данные для генератора случайных чисел
  3.  
  4. s  rd 4
Дальше выполняется инициализация. В оригинальном алгоритме есть два варианта инициализации - "короткая" и "длинная". Они отличаются только количеством холостых прокруток генератора, соответственно, 264 и 296 раз. Я решил использовать второй вариант.
  1. ;---------------------------------------------
  2. ; Инициализация генератора случайных чисел
  3. ; stdcall long_jump,seed
  4. ;---------------------------------------------
  5. proc long_jump seed:DWORD
  6.         locals
  7.              s0 dd ?
  8.              s1 dd ?
  9.              s2 dd ?
  10.              s3 dd ?
  11.         endl
  12.  
  13.         pusha
  14.  
  15.         ; Начальное "засеивание" генератора
  16.         mov     edi,s
  17.         mov     eax,[seed]
  18.         rol     eax,1
  19.         xor     eax,0x1C580662
  20.         stosd
  21.         rol     eax,3
  22.         add     eax,0x0B6F099F
  23.         stosd
  24.         rol     eax,5
  25.         xor     eax,0xB523952E
  26.         stosd
  27.         rol     eax,7
  28.         sub     eax,0xCCF5A0EF
  29.         stosd
  30.  
  31.         ; Холостая прокрутка генератора для инициализации
  32.         lea     edi,[s0]
  33.         push    edi
  34.         xor     eax,eax
  35.         stosd
  36.         stosd
  37.         stosd
  38.         stosd
  39.  
  40.         xor     ebx,ebx
  41. .loc_for_1:
  42.         xor     ecx,ecx
  43. .loc_for_2:
  44.         mov     eax,[.lj+ebx*4]
  45.         and     eax,1
  46.         shl     eax,cl
  47.         jz      @f
  48.  
  49.         mov     esi,s
  50.         lodsd
  51.         xor     [s0],eax
  52.         lodsd
  53.         xor     [s1],eax
  54.         lodsd
  55.         xor     [s2],eax
  56.         lodsd
  57.         xor     [s3],eax
  58. @@:
  59.         stdcall next
  60.  
  61.         inc     ecx
  62.         cmp     ecx,32
  63.         jb      .loc_for_2
  64.  
  65.         inc     ebx
  66.         cmp     ebx,4
  67.         jb      .loc_for_1
  68.  
  69.         pop     esi
  70.         mov     edi,s
  71.         movsd
  72.         movsd
  73.         movsd
  74.         movsd
  75.  
  76.         popa
  77.         ret
  78.  
  79. .lj:    dd 0xB523952E
  80.         dd 0x0B6F099F
  81.         dd 0xCCF5A0EF
  82.         dd 0x1C580662
  83. endp
Также стоит упомянуть начальное "засеивание" рабочего буфера генератора. В комментариях к оригинальному коду просто сказано, что буфер не должен быть полностью нулевым, а все действия по его заполнению отдаются целиком на откуп программиста. Я добавил свой вариант заполнения, который показался мне рабочим, вы можете заменить его на любой другой. В принципе, достаточно инициализировать ненулевым значением любой из четырех DWORD'ов буфера.

Читать статью целиком »
Просмотров: 1139 | Комментариев: 3

Генератор Mersenne Twister на Ассемблере

13.06.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Mersenne Twister (Вихрь Мерсенна) - высокоэффективный генератор псевдослучайных чисел, разработанный Makoto Matsumoto и Takuji Nishimura. К математику Марену Мерсенну название имеет отношение потому, что период генерации равняется числу 219937-1, которое, в свою очередь, является числом Мерсенна. Несмотря на то, что Mersenne Twister является одним из наиболее тщательно протестированных генераторов ПСЧ из ныне существующих, а выдаваемые им последовательности проходят статистические тесты, использование Mersenne Twister в криптографии не рекомендуется без дополнительного шифрования.

Для работы генератора требуется достаточно объемная структура, в которой сохраняется текущее состояние каждого измерения.
  1. MT_SIZE = 624
  2. PERIOD  = 397
  3. DIFF    = MT_SIZE-PERIOD
  4.  
  5. struct MT_STATE
  6.         index       dd ?
  7.         mt          rd MT_SIZE
  8.         mt_tempered rd MT_SIZE
  9. ends
  10.  
  11. state MT_STATE
Сам генератор состоит из двух функций - инициализация и генерация. В принципе, можно добавить генерацию случайного числа в заданном интервале, но тут я этого делать не стал, можете посмотреть реализацию в других генераторах.

Читать статью целиком »
Просмотров: 1106 | Комментариев: 1

prev 01 02
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0025 сек.) / Память: 4.5 Mb
Наверх