Новичок
Регистрация: 06.01.2013
Сообщений: 47
Репутация: 27
|
Здравствуйте. Нужно реализовать алгоритм рандом на ассемблере для выбора случайного числа в диаппазоне 0-254. Вот нашол код
Код:
procedure _RandInt; asm { ->EAX Range } { <-EAX Result } PUSH EBX {$IFDEF PIC} PUSH EAX CALL GetGOT MOV EBX,EAX POP EAX MOV ECX,[EBX].OFFSET RandSeed IMUL EDX,[ECX],08088405H INC EDX MOV [ECX],EDX {$ELSE} XOR EBX, EBX IMUL EDX,[EBX].RandSeed,08088405H INC EDX MOV [EBX].RandSeed,EDX {$ENDIF} MUL EDX MOV EAX,EDX POP EBX end; |
||
Оценка
|
Новичок
Регистрация: 25.11.2008
Адрес: ДОНЕЦК
Сообщений: 313
Репутация: 58
|
Это ассемблер под АВРку???
Почитай второе- третье издание искусство схемотехники.Там есть описание вполне работоспособного алгоритма! |
||
Оценка
|
Новичок
Регистрация: 06.01.2013
Сообщений: 47
Репутация: 27
|
либо я что-то не так делаю..
Видел алгоритмы на регистрах сдвига, в шпротеусе то что-то похож. Для мк нашол подобный алгоритм, поковырял его получил : 1. Выполнить XOR (исключающее или) над 8-м и 5-м битом (согласно нашему многочлену). 2. Сдвинуть наш регистр влево на 1 бит. 3. Занести результат 1-й операции в 0-й бит рагистра . Код:
ldi Temp,22 грузим число 22 push Temp1 eor Temp1, Temp bst Temp, 4 bld Temp1, 0 clt bst Temp, 7 bld Temp1, 1 cpi Temp1, 0; оба бита равны нулю - результат xor - ноль breq XOR0 cpi Temp1, 3; оба бита равны единице, результат - ноль breq XOR0 rjmp XOR1; иначе результат - единица XOR0: lsl Temp; сдвигаем LFSR влево на 1 clt bld Temp, 0; вносим ноль справа pop Temp1 ret XOR1: lsl Temp set bld Temp, 0 pop Temp1 ret На рисунках результат работы регистра сдвига. |
||
Оценка
|
Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
|
Стоит заглянуть вот в эту ветку http://radiokot.ru/forum/viewtopic.php?t=7603.
А посмотреть всё же нужно «Д.Кнут. Искусство программирования», а не «Хоровиц-Хилл. Искусство схемотехники» по совету BOB51. У Кнута, собственно, и описаны ограничения «коротких» алгоритмов. В частности, большинство реализованных в библиотеках под AVR и PIC генераторов псевдослучайных последовательностей кроме явной «предсказуемости» из-за начала последовательности, имеют ограничения на тип возвращаемого значения с длиной не более 8(16) бит. Поэтому Ваше огорчение по поводу «слабости алгоритма» мне понятны и близки и связаны они исключительно с ограниченным набором функций распределения, которыми можно безболезненно оперировать на слабой архитектуре. На МК я решал аналогичную задачу использованием библиотечной srand() на Си и запущенным на 100Гц таймером, который сдвигал начало последовательности на величину текущего тика таймера или сложнее – на величину сгенерированного перед его прерыванием числа, смешанного с числом из заранее забитой в FLASH/EEPROM небольшой таблицы с нормальным распределением, в свою очередь сгенерированной на ПК (в моём случае в Maple). Такой себе генератор над генератором. Это совсем не «расширяет область» генерируемого диапазона чисел (если с таблицей - всё зависит от свободной памяти или размера внешней (AT45!), но не даёт возможность по возникновению события, для которого нужно случайное число, уйти от периода этого самого события (если событие внешнее). А задача с таким внешним событием была – контроллер для игрового автомата в тире с вращающимся барабаном и кучей светящихся стрелок, где игрок должен попасть по подсвеченной в данный момент кнопке. Кроме случайного выбора кнопки, потребовалось добавить случайную задержку в диапазоне 0-0,5 сек. на остановку двигателя барабана, обеспечив тем самым свободный выбег редуктору случайным образом (по аналогии с включением стопора). Действовать синхронно с периодом события 10мс человеку очень сложно, если не сказать невозможно. Так что если программа «человеко-ориентированная», может вовсе можно отказаться от генератора?
Последний раз редактировалось antonydublin; 27.11.2013 в 02:01.
|
||
Оценка
|
Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
|
Недавно появился замечательный OpenSource/OpenHardware проект генератора случайных чисел. Увидев страницу OneRNG by Paul Campbell, вспомнил про эту тему на форуме.
В нескольких словах: используются два различных источника шума. Первый «классический» – шум лавинного диода, сформированного парой транзисторов, второй – микросхема радиотрансивер СС2531 – известная в узких кругах SoC для 802.15.4, измеряющая поканально скачки мощности сигналов в диапазоне 2,4ГГц. Вся схема оформлена в виде USB брелка с интерфейсом USB-CDC – виртуальным последовательным портом, неоднократно использовавшимся в различных проектах на РадиоЛоцмане. Проект изначально разрабатывался для использования с Linux, но, ввиду универсальности COM-порта, привязать к своему приложению в Windows не составит труда. Код написан в SDCC для ядра 8051, легко поддаётся изменениям (к слову – в семействе CC253x есть трансивер CC2538 с Cortex-M3). Так или иначе, на странице проекта описана схемотехника и все особенности работы. Приведён пример GUI в Qt. В общем – то что нужно для задач криптографии на ПК, МК и не только. Но… к сожалению, пока проект не использует встроенные возможности СС2531 по AES шифрованию для «отбеливания» потока данных с устройства – просто не с чем сравнивать при верификации (взамен используется CRC16 из-за своей открытости). Поэтому такой брелок, по словам разработчиков, является хорошим источником энтропии для более мощного алгоритма RNG (т.е. у разработчиков получился очередной внешний источник энтропии для работы в связке с генератором псевдослучайной последовательности). Оба источника энтропии могут использоваться отдельно или одновременно. Доступны также «сырые» данные. От себя добавлю, что таких проектов десятки, но этот мне показался наиболее хорошо документированным. Авторы, не скрывая, признаются в справедливости скептических взглядов к такому подходу. Ведь на самом деле, «гвоздей» в описанный проект можно забить много. Как выразился сам автор – «Paranoia abounds!». |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |