Написать программу, генерирующую последовательность из 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) и возвращается управление в операционную систему.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д