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

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

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

В книге Зубкова наткнулась на программку, которая генерирует случайные числа при помощи системного таймера:
Листинг программы
  1. rand proc near
  2. push edx
  3. mov eax,dword ptr seed ;считать последнее
  4. ;случайное число
  5. test eax,eax ;проверить его, если это -1,
  6. js fetch_seed ;функция ещё ни разу не вызывалась
  7. надо создать начальные значения
  8. randomize:
  9. mul dword ptr rand_a ;умножить число на а
  10. div dword ptr rnd_m ;взять остаток от деления 2^31-1
  11. mov eax,edx
  12. mov dword ptr seed,eax ;сохранить для следующих вызовов
  13. pop edx
  14. ret
  15. fetch_seed:
  16. push ds
  17. push 0040h
  18. pop ds
  19. mov eax,dword ptr ds:006ch ;считать двойное слово из области
  20. pop ds ;данных BIOS по адресу
  21. ;0040-006С - текущее число
  22. jmp short randomize ;тактов таймера
  23. rand_a dd 69621
  24. rand_m dd 7fffffffh
  25. seed dd -1
  26. rand endp
Хотелось бы переписать эту программу на ФАСМ и для 16-ти разрядных регистров. Подскажите, как это сделать. Меняла mov dword ptr.. просто на mov, ругается на (-1)

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

textual
Листинг программы
  1. ;fasm code
  2. ;----------------
  3. rand proc near
  4.   push  edx
  5.   mov   eax,[seed]             ;считать последнее случайное число
  6.   test  eax,eax                ;проверить его, если это -1,
  7.   js    fetch_seed             ;функция ещё ни разу не вызывалась
  8.                                ; ..и надо создать начальные значения
  9. randomize:
  10.   mul   [rand_a]               ;умножить число на а
  11.   xor   edx,edx
  12.   div   [rnd_m]                ;взять остаток от деления 2^31-1
  13.   mov   eax,edx
  14.   mov   [seed],eax             ;сохранить для следующих вызовов
  15.   pop   edx
  16.   ret
  17.  
  18. fetch_seed:
  19.   push  ds
  20.   push  0040h
  21.   pop   ds
  22.   mov   eax,dword[ds:006ch]    ;считать текущее число тактов таймера
  23.   pop   ds
  24.   jmp   randomize            
  25.  
  26.  rand_a   dd  69621
  27.  rand_m   dd  7fffffffh
  28.  seed     dd  -1
  29. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы