Генератор случайных чисел - Assembler (223566)
Формулировка задачи:
В книге Зубкова наткнулась на программку, которая генерирует случайные числа при помощи системного таймера:
Хотелось бы переписать эту программу на ФАСМ и для 16-ти разрядных регистров. Подскажите, как это сделать.
Меняла mov dword ptr.. просто на mov, ругается на (-1)
rand proc near
push edx
mov eax,dword ptr seed ;считать последнее
;случайное число
test eax,eax ;проверить его, если это -1,
js fetch_seed ;функция ещё ни разу не вызывалась
;и надо создать начальные значения
randomize:
mul dword ptr rand_a ;умножить число на а
div dword ptr rnd_m ;взять остаток от деления 2^31-1
mov eax,edx
mov dword ptr seed,eax ;сохранить для следующих вызовов
pop edx
ret
fetch_seed:
push ds
push 0040h
pop ds
mov eax,dword ptr ds:006ch ;считать двойное слово из области
pop ds ;данных BIOS по адресу
;0040-006С - текущее число
jmp short randomize ;тактов таймера
rand_a dd 69621
rand_m dd 7fffffffh
seed dd -1
rand endpРешение задачи: «Генератор случайных чисел»
textual
Листинг программы
;fasm code ;---------------- rand proc near push edx mov eax,[seed] ;считать последнее случайное число test eax,eax ;проверить его, если это -1, js fetch_seed ;функция ещё ни разу не вызывалась ; ..и надо создать начальные значения randomize: mul [rand_a] ;умножить число на а xor edx,edx div [rnd_m] ;взять остаток от деления 2^31-1 mov eax,edx mov [seed],eax ;сохранить для следующих вызовов pop edx ret fetch_seed: push ds push 0040h pop ds mov eax,dword[ds:006ch] ;считать текущее число тактов таймера pop ds jmp randomize rand_a dd 69621 rand_m dd 7fffffffh seed dd -1 rand endp
Объяснение кода листинга программы
- Функция
randгенерирует случайные числа. - При первом вызове функции
randпроверяется, является ли предыдущее случайное число -1. - Если предыдущее случайное число -1, то выполняется функция
fetch_seed, которая устанавливает начальные значения для генерации случайных чисел. - В функции
randomizeпроисходит генерация нового случайного числа путем умножения предыдущего случайного числа наrand_aи взятия остатка от деления наrnd_m. - Полученное случайное число сохраняется для последующего использования в переменной
seed. - Функция
fetch_seedиспользуется при первом вызове функцииrandи считывает текущее число тактов таймера. - Переменные
rand_a,rand_mиseedсодержат следующие значения:rand_a= 69621rand_m= 7fffffffhseed= -1