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

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

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

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

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

textual
Листинг программы
    .model flat
    .data
; диапазон случайных чисел
left    equ -20
right   equ 20
; количество элементов массива
n   equ 50
m   dd n dup(?)
    .code
main proc 
    mov  edi, (right-left)+1
    mov  ebx, -(type m)
    mov  ecx, n
l:  add  ebx, type m
 
    ; генерация случайных чисел на основе тактов процессора
    rdtsc             ; edx:eax  (64-битное количество тактов с момента последнего сброса процессора)
    add  esi, edx     
    mul  esi          
    shrd eax, edx, 16 
    xor  esi, eax     
    
    ; границы (здесь, конечно, может сломаться случайность)
    mov eax, esi
    xor edx, edx
    div edi
    add edx, left
 
    mov m[ebx], edx
    loop l
 
    test ax, ax
    ret
main endp
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
Похожие ответы