 |
Ассемблер в примерах - Генерация псевдослучайных чисел
- Вопрос:
- Как реализовать поставленную задачу : Генерация псевдослучайньlх 16-разрядных чилел. Под проц. АТ8952
- Ответ:
- В приложении подпрограмма с подробными комментариями, генерирующая псевдослучайные числа.
;очередная псевдослучайная величина считается по формуле Xn =(AA * Xn-1 + CC) mod 16536,
;где Xn-1 - предыдущее значение, Xn - посчитанное очередное значение
;АА, СС - 16-битные константы. К ним требования:
;СС - простое число, АА и 16536 - взаимо просты, при этом (АА-1) делится на 4
;mod 16536 - младшие 16 бит результата, старшие биты отбрасываем.
;(Вообще говоря, умножение двух 16-битных величин даст 32-битную величину)
;константы для вычисления
aa equ 13013
cc equ 16383
x_low equ 60 ;младший байт случайной величины
x_high equ 61 ;старший байт случайной величины
;наша случайная 16-битная величина хранится в паре ячеек x_low, x_high
;в процессе вычисления используется регистр r7 текущего банка
;сначала умножаем столбиком AA и Xn-1, причем учитываем только младшие два байта результата!
;затем добавим СС - это и будет искомая случайная величина
rnd: mov a, x_low ;умножаем младший байт Xn-1 и младший байт константы АА
mov b, #(low aa)
mul ab ;в acc младший, в B старший байты произведения
mov r7, b ;сохраним старший байт в R7
;
xch a, x_low ;обменяем местами мл байт произведения
; и младший байт Xn-1 (мл байт уже на месте)
mov b, #(high aa) ;умножим младшее значение Xn-1 на ст байт АА
mul ab
add a, r7 ;добавим до ст байта результата
mov r7, a
;все последующие вычисления игнорируем,
;все равно их надо отбросить
;
mov a, x_high ;умножим старший байт Xn-1 на мл байт АА
mov b, #(low aa)
mul ab
add a, r7 ;добавим до ст байта результата
mov x_high, a ;и сохраним, как новое значение ст байта Xn
;все последующие вычисления игнорируем,
;все равно их надо отбросить
;
mov a, x_low ;добавим к Xn константу СС
add a, #(low cc) ;сначала мл байт
mov x_low, a
mov a, x_high ;затем ст байт
addc a, #(high cc) ;учитываем перенос от предыдущей операции
mov x_high, a
ret
|  |