Написать программу, генерирующую последовательность из 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.
- Вначале определены основные переменные:
- left — равна -20, определяет левую границу диапазона;
- right — равна 20, определяет правую границу диапазона;
- n — содержит количество элементов в последовательности, равное 50;
- m — массив, в который будут сохраняться сгенерированные числа, инициализированный 50-ю случайными числами (здесь используется регистр ebx, как индекс для обращения к элементам массива).
- В блоке кода 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 итераций).
- В конце кода выполняется проверка на ноль результата последней операции (для корректного выхода из программы при отсутствии чисел в массиве m) и возвращается управление в операционную систему.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д