Генератор случайных чисел - Assembler (223566)

Узнай цену своей работы

Формулировка задачи:

В книге Зубкова наткнулась на программку, которая генерирует случайные числа при помощи системного таймера:
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
Хотелось бы переписать эту программу на ФАСМ и для 16-ти разрядных регистров. Подскажите, как это сделать. Меняла mov dword ptr.. просто на mov, ругается на (-1)

Решение задачи: «Генератор случайных чисел»

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

Объяснение кода листинга программы

  1. Функция rand генерирует случайные числа.
  2. При первом вызове функции rand проверяется, является ли предыдущее случайное число -1.
  3. Если предыдущее случайное число -1, то выполняется функция fetch_seed, которая устанавливает начальные значения для генерации случайных чисел.
  4. В функции randomize происходит генерация нового случайного числа путем умножения предыдущего случайного числа на rand_a и взятия остатка от деления на rnd_m.
  5. Полученное случайное число сохраняется для последующего использования в переменной seed.
  6. Функция fetch_seed используется при первом вызове функции rand и считывает текущее число тактов таймера.
  7. Переменные rand_a, rand_m и seed содержат следующие значения:
    • rand_a = 69621
    • rand_m = 7fffffffh
    • seed = -1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы