Даны площади нескольких окружностей. Вывести радиус самой маленькой - 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

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

  1. В начале кода объявлены следующие переменные:
    • arrayS - массив из пяти значений типа double, представляющих площади окружностей.
    • arraySize - переменная типа double, содержащая количество элементов в массиве arrayS.
    • biggestS - переменная типа double, в которой будет храниться наибольшая площадь.
    • message - строка символов, используемая в качестве формата для функции printf.
    • R - переменная типа double, в которой будет храниться найденный радиус.
  2. Код выполняет следующие действия:
    • С помощью цикла while происходит перебор всех элементов массива arrayS.
    • На каждой итерации цикла происходит сравнение текущего элемента массива с текущим значением переменной biggestS.
    • Если текущий элемент массива больше biggestS, то он заменяет biggestS.
    • После выполнения цикла, в переменной R содержится квадратный корень из наибольшей площади.
    • Затем, с помощью функции printf выводится сообщение, содержащее значение R.
  3. Код использует следующие ассемблерные инструкции:
    • mov - используется для копирования значений между регистрами и/или переменными.
    • cmp - используется для сравнения двух значений.
    • jb - используется для перехода к следующему блоку кода, если выполнено условие (eax < biggestS).
    • mov - используется для копирования значения из переменной biggestS в переменную R.
    • finit - инициализирует математический сопроцессор.
    • fld - используется для заноса значения на стек сопроцессора.
    • fdiv - используется для деления на число Пи.
    • fsqrt - используется для извлечения квадратного корня.
    • fst - используется для записи значения из стека сопроцессора в переменную.
    • call - используется для вызова функции.
    • add - используется для увеличения значения указателя на стек.
    • ret - используется для возврата из функции.
  4. Значение 4C00h, которое стоит в конце кода, является кодом возврата функции main.

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


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

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

11   голосов , оценка 4.182 из 5
Похожие ответы