Сборник по задачам и примерам Assembler


Аддитивный генератор случайных чисел - часть 2


Следующий рассматриваемый нами датчик можно использовать в программах на языке ассемблера для получения случайной последовательности 0 и 1.

Программа генерации высокослучайных двоичных наборов

Для процесса генерации требуются два значения одинаковой размерности — Y и С. Значение Y будет первым в последовательности случайных чисел. Значение С играет роль маски, в соответствии с которой впоследствии будет производиться операция «исключающее ИЛИ». Генерация очередного случайного числа происходит в два этапа. На первом этапе значение Y сдвигается влево на один разряд. При этом нас интересует содержимое выдвинутого бита. Его значением устанавливается флаг eflags.cf. На втором этапе, если cf=1, то корректируем значение Y= =Y XOR С и сохраняем Y; в противном случае сохраняем сдвинутое значение в качестве очередного числа последовательности.

:rand_bin_1.asm - программа генерации высокослучайных двоичных наборов

:(сокращенный вариант).

:Вход: у. с - в соответствии с указанными выше ограничениями.

:Выход: dl - значение очередного случайного числа.

.data

Y db 35h : Obh

С db 33h :03h

. code

cycl: shl Y.I

jnc ml

mov al ,Y

xor al ,C

mov Y.al ml: :вывод на экран (в файл - командная строка rand_bih.exe > p.txt)

jmp cycl end_cycl:

Содержимое файла, в который перенаправлен вывод программы, показывает, что период последовательности достаточно удовлетворительный (при удачном подборе Y и С). Для того чтобы получить случайную последовательность 0 и 1, необходимо на каждой итерации выделять младший или старший бит очередного значения. Доработаем программу rand_bin_1.asm, чтобы продемонстрировать этот прием.

:rand_bin_2.asm - программа генерации высокослучайных двоичных наборов (полный вариант).

:Вход: у. с - в соответствии с указанными выше ограничениями.

;Выход: dl - значение очередного случайного числа.

.data

Y db 35h :0bh

С db 33h ;03h

.code

: получаем очередное значение Y

push ds

push 40h

pop ds

mov eax.dword ptr ds:006ch

pop ds

mov Y.al

xor dl.dl

mov ecx,8 Нормируем случайные 8-ми битовые наборы в регистре DL cyct: shl Y.I




- Начало -  - Назад -  - Вперед -