Генератор случайных чисел - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д