Написать программу, генерирующую последовательность из 50 случайных чисел в диапазоне -20...+20 - Assembler

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

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

Напишите программу, которая бы генерировала и отображала на экране последовательность из 50 случайных чисел. Значения этих чисел должны находиться в диапазоне -20...+20.

Решение задачи: «Написать программу, генерирующую последовательность из 50 случайных чисел в диапазоне -20...+20»

textual
Листинг программы
  1.     .model flat
  2.     .data
  3. ; диапазон случайных чисел
  4. left    equ -20
  5. right   equ 20
  6. ; количество элементов массива
  7. n   equ 50
  8. m   dd n dup(?)
  9.     .code
  10. main proc
  11.     mov  edi, (right-left)+1
  12.     mov  ebx, -(type m)
  13.     mov  ecx, n
  14. l:  add  ebx, type m
  15.  
  16.     ; генерация случайных чисел на основе тактов процессора
  17.     rdtsc             ; edx:eax  (64-битное количество тактов с момента последнего сброса процессора)
  18.     add  esi, edx    
  19.     mul  esi          
  20.     shrd eax, edx, 16
  21.     xor  esi, eax    
  22.    
  23.     ; границы (здесь, конечно, может сломаться случайность)
  24.     mov eax, esi
  25.     xor edx, edx
  26.     div edi
  27.     add edx, left
  28.  
  29.     mov m[ebx], edx
  30.     loop l
  31.  
  32.     test ax, ax
  33.     ret
  34. main endp
  35. end

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

В коде реализована генерация последовательности из 50 случайных чисел в диапазоне -20...+20.

  1. Вначале определены основные переменные:
    • left — равна -20, определяет левую границу диапазона;
    • right — равна 20, определяет правую границу диапазона;
    • n — содержит количество элементов в последовательности, равное 50;
    • m — массив, в который будут сохраняться сгенерированные числа, инициализированный 50-ю случайными числами (здесь используется регистр ebx, как индекс для обращения к элементам массива).
  2. В блоке кода main proc содержится основной цикл:
    • Вначале вычисляется размер диапазона (разница между правой и левой границами, к которой добавляется 1): edi = (right-left)+1.
    • Задаётся начальное значение для ebx, которое будет использоваться как индекс для обращения к элементам массива m: mov ebx, -(type m).
    • В цикле выполняется генерация 50 случайных чисел (до тех пор, пока не будет выполнено условие остановки).
    • Для генерации используется способ, основанный на количестве тактов процессора (см. инструкцию rdtsc). Полученное значение делится на 16 (для получения значения только в верхних 16 битах), затем на 2 (для получения значения в верхних 8 битах), затем умножается на полученное значение (для получения случайного числа в верхних 8 битах).
    • После этого полученное случайное число смещается вправо на величину, равную левой границе диапазона: mov eax, esi; xor edx, edx; div edi; add edx, left.
    • Содержимое регистра edx (случайное число) сохраняется в массиве m по индексу, равному значению ebx.
    • Цикл продолжается до тех пор, пока не будет выполнено условие остановки (до тех пор, пока не будет выполнено 50 итераций).
  3. В конце кода выполняется проверка на ноль результата последней операции (для корректного выхода из программы при отсутствии чисел в массиве m) и возвращается управление в операционную систему.

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


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

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

11   голосов , оценка 3.636 из 5

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

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

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