Даны площади нескольких окружностей. Вывести радиус самой маленькой - Assembler
Формулировка задачи:
Буду благодарен за любую помощь, если поможете с готовым кодом, то большая просьба - как можно проще.
Собственно задание в заголовке:
Даны площади нескольких окружностей. Вывести радиус самой маленькой.
Как выбрать самую маленькую?
Решение задачи: «Даны площади нескольких окружностей. Вывести радиус самой маленькой»
textual
Листинг программы
global _main extern _printf section .data arrayS dd 10.0, 144.0, 50.0, 1.0, 20.0 ; массив площадей arraySize dd 5 ; размер массива biggestS: dd 0.0 ; будет содержать самую большую площадь message: db "R for the biggest S is %f", 0 ; форматная строка для printf R: dq 0.0 ; найденный радиус ; code section .text _main: mov ecx, [arraySize] ; длина массива L1: mov eax, [arrayS+ecx*4-4] ; выбираем одно значение из массива cmp eax, [biggestS] ; сравниваем с наибольшим найденным jb CONTINUE ; если eax < biggestS - ПРХ CONTINUE mov [biggestS], eax ; сохраняем новое наибольшее значение площади CONTINUE: loop L1 ; идем на следующую итерацию. ecx уменьшается на 1. Цикл выполняется, пока ecx не станет = 0 finit ; инициализируем мат. сопроцессор fld dword [biggestS] ; укладываем на стек сопроцессора делимое fldpi ; укладываем на стек делитель (число Пи) fdivp ; производим деление fsqrt ; берем квадратный корень fst qword [R] ; записываем результат в R output: mov eax, R ; записываем адрес переменной R в eax fld QWORD [eax] ; заносим на стек сопроцессора переменную R (берем по адресу их eax) sub esp,8 ; уменьшаем указатель на стек (обычный) на размер этой переменной (8 байт) fstp QWORD [esp] ; заносим на обычный стек нашу переменную (стек находится по адресу esp) push message ; заносим на стек форматную строку для printf call _printf ; вызов printf add esp,12 ; подчищаем стек после вызова (8 - число + 4 - указатель на строку) end: mov ax, 4C00h ret
Объяснение кода листинга программы
- В начале кода объявлены следующие переменные:
- arrayS - массив из пяти значений типа double, представляющих площади окружностей.
- arraySize - переменная типа double, содержащая количество элементов в массиве arrayS.
- biggestS - переменная типа double, в которой будет храниться наибольшая площадь.
- message - строка символов, используемая в качестве формата для функции printf.
- R - переменная типа double, в которой будет храниться найденный радиус.
- Код выполняет следующие действия:
- С помощью цикла while происходит перебор всех элементов массива arrayS.
- На каждой итерации цикла происходит сравнение текущего элемента массива с текущим значением переменной biggestS.
- Если текущий элемент массива больше biggestS, то он заменяет biggestS.
- После выполнения цикла, в переменной R содержится квадратный корень из наибольшей площади.
- Затем, с помощью функции printf выводится сообщение, содержащее значение R.
- Код использует следующие ассемблерные инструкции:
- mov - используется для копирования значений между регистрами и/или переменными.
- cmp - используется для сравнения двух значений.
- jb - используется для перехода к следующему блоку кода, если выполнено условие (eax < biggestS).
- mov - используется для копирования значения из переменной biggestS в переменную R.
- finit - инициализирует математический сопроцессор.
- fld - используется для заноса значения на стек сопроцессора.
- fdiv - используется для деления на число Пи.
- fsqrt - используется для извлечения квадратного корня.
- fst - используется для записи значения из стека сопроцессора в переменную.
- call - используется для вызова функции.
- add - используется для увеличения значения указателя на стек.
- ret - используется для возврата из функции.
- Значение 4C00h, которое стоит в конце кода, является кодом возврата функции main.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д