PDA

Просмотр полной версии : Помогите с генератором псевдослучайных чисел. Просто дайте совет, пожалуйста.



T@uRuS
25.11.2007, 12:29
Тут такая вот, проблема: с ассемблером я общаюсь совсем недолго, и то в плане учебы. Мне нужно написать программу на МПК 1810 -проблема в том что он 16-разрядный. я нашел несколько примеров написания, генераторов. Вот один из них:
Генератор случайных чисел
; Интервал: [0..eax-1] ;
;--------------------------------------------;
; Используется алгоритм ГПСЧ Джорджа Марсаглии - "Xorshift - 128" ;
; Данный алгоритм прошёл тест DIEHARD его период 2^128-1 ;
;--------------------------------------------;
; Использование: call r_init ;
; mov eax, ГРАНИЦА ИНТЕРВАЛА ;
; call brandom32 ;
;--------------------------------------------;
; Результат: число в интервале [0..ГРАНИЦА ИНТЕРВАЛА] ;
;

;---[Подпрограмма инициализации генератора случайных чисел]---;

r_init:
push ebp eax edx ; Сохраняем в стэке ebp,eax,edx

call __delta1_ ;
__delta1_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta1_ ;

db 0fh,031h ; Получаем случайное зерно
mov [ebp+x],eax ;

pop edx eax ebp ; Восстанавливаем edx,eax,ebp

ret ; Возврат из подпрограммы

;---[Подпрограмма генерации случаного чмсла в диапазоне]---;

brandom32: ; Эта подпрограмма
; возвращает случайное число
; в диапазоне 0..eax-1

push edx ecx ebp ; Сохраняем в стэке edx,ecx,ebp

call __delta2_ ;
__delta2_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta2_ ;

imul eax,eax,100 ; Умножаем eax на 100
push eax ; и сохраняем eax в стэке

call random32 ; Вызываем подпрограмму
; генерации случайного числа
xor edx,edx ; Обнуляем edx
pop ecx ; Восстанавливаем значение
; из стэка в ecx
div ecx ; Делим eax на ecx
xchg eax,edx ; Помещаем остаток в eax
xor edx,edx ; Обнуляем edx
push 100 ; Помещаем в ecx - 100
pop ecx ;
div ecx ; Делим eax на ecx
pop ebp ecx edx ; Восстанавливаем ebp,ecx,edx,
ret ; Возврат из подпрограммы

;---[Подпрограмма генерации случайного числа]---;

random32:
push ebx edx ecx ;
push ebp ; Сохраняем регистры в стэке

call __delta3_ ;
__delta3_: pop ebp ; Получение дельта смещения
sub ebp,offset __delta3_ ;

mov eax,12345678 ;
x = dword ptr $-4 ;
shl eax,0bh ; Выполняем математические
xor eax,[ebp+x] ; преобразования по нужному нам
mov edx,362436069 ; алгоритму
y = dword ptr $-4
mov [ebp+x],edx
mov ecx,521288629
z = dword ptr $-4
mov [ebp+y],ecx
mov ebx,88675123
w = dword ptr $-4
mov [ebp+z],ebx
mov edx,[ebp+w]
shr edx,13h
xor edx,[ebp+w]
xor edx,eax
shr eax,08h
xor edx,eax
mov [ebp+w],edx
mov eax,edx

pop ebp ;
pop ecx edx ebx ; Вынимаем регистры из стэка

retn ; Возврат из подпрограммы

Как я понимаю это программа для 32-разрядного процессора... Если мне нужно для 16-разрядного, достаточно ли просто сделать такие вот операции? eax=ax edx=dx, и т.д.? Подскажите мне плиз. И еще, если я правильно понял, то это генератор типа xorshift. Верно?

somewhere
26.11.2007, 09:02
Как я понимаю это программа для 32-разрядного процессора... Если мне нужно для 16-разрядного, достаточно ли просто сделать такие вот операции? eax=ax edx=dx, и т.д.?
Нет, этого не достаточно. К тому же процессор на базе архитектуры Intel 8080 имеет другие регистры и специфическую адресацию памяти. Предположительно код возрастет в 2-3 раза.