Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Генерация псевдослучайных чисел

Вопрос:
Как реализовать поставленную задачу : Генерация псевдослучайнь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


   Вперёд
   Содержание