Дана площадь S круга. Найти его диаметр D и длину L окружности - Assembler
Формулировка задачи:
Помогите пожалуйста перевести данный код в Assembler:
Дана площадь S круга. Найти его диаметр D и длину L окружности, ограничивающей этот круг,
учитывая, что L=2*p*R, S=p*R2. В качестве значения p использовать 3,14.
Код Pascal
Program Begin15; const pi=3.14; var S:real; D,L:real; begin Writeln('Введите площадь окружности S='); readln(S); D:=2*sqrt(S/pi); L:=D*pi; Writeln('диаметр круга =',Floattostr(D)); Writeln('длина окружности круга =',Floattostr(L)); end.
Решение задачи: «Дана площадь S круга. Найти его диаметр D и длину L окружности»
textual
Листинг программы
;FASM, сохранять в cp866 format PE console 4.0 include 'win32a.inc' cinvoke printf, tps, msgS ; выводим приглашение cinvoke scanf, tpf, S ; вводим площадь cmp eax, 1 ; верный ввод? jnz gtfo ; нет, отваливаем fldpi ; грузим число Пи в сопроцессор fld dword [S] ; грузим площадь в сопроцессор fdiv st0, st1 ; делим площадь на Пи fsqrt ; извлекаем корень fimul dword [two] ; умножаем на 2 fst qword [D] ; сохраняем в D sub esp,8 ; место в стеке для printf fst qword [esp] ; сохраняем диаметр в стеке fmulp ; умножаем диаметр на Пи fst qword [L] ; сохраняем в L sub esp,8 ; место в стеке для printf fstp qword [esp] ; сохраняем длину в стеке cinvoke printf, msgD ; выводим на экран add esp, 10h ; очищаем стек от D и L invoke fflush, 0 ; актуализируем буфферизованный вывод invoke _getch ; any key gtfo: invoke exit, 0 ; выход align 4 two: dd 2 L: dq ? D: dq ? S: dd ? msgS: db 'Введите площадь окружности S=',0 msgD: db 'длина окружности круга =%4.8f', 0Dh, 0Ah msgL: db 'диаметр круга =%f',0 tps db '%s',0 tpf db '%f',0 data import library msvcrt,'msvcrt.dll' import msvcrt,\ printf,'printf',\ scanf,'scanf',\ fflush,'fflush',\ _getch,'_getch',\ exit,'exit' end data
Объяснение кода листинга программы
- Объявлены переменные:
- S (введенная площадь круга)
- D (диаметр круга)
- L (длина окружности круга)
- two (число 2)
- msgS (приглашение для ввода площади)
- msgD (формат вывода длины окружности)
- msgL (формат вывода диаметра круга)
- tps (формат вывода строки)
- tpf (формат вывода числа с плавающей точкой)
- Загрузка числа Пи в сопроцессор.
- Ввод площади круга с помощью функции scanf.
- Проверка корректности ввода с помощью оператора cmp.
- Загрузка площади круга в сопроцессор.
- Деление площади на число Пи с помощью инструкции fdiv.
- Извлечение квадратного корня из результата с помощью инструкции fsqrt.
- Умножение полученного значения на 2 с помощью инструкции fimul.
- Сохранение результата в переменную D с помощью инструкции fst.
- Очистка стека для сохранения диаметра круга.
- Умножение диаметра на число Пи с помощью инструкции fmul.
- Сохранение результата в переменную L с помощью инструкции fst.
- Очистка стека для сохранения длины окружности.
- Вывод сообщения msgD с помощью функции printf.
- Вывод сообщения msgL с помощью функции printf.
- Вывод сообщения msgS с помощью функции printf.
- Вызов функции fflush для актуализации буферизованного вывода.
- Вызов функции _getch для проверки нажатия любой клавиши.
- Выход из программы с помощью функции exit.
- Альтернативный вариант конца программы (не используется).