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