Дана площадь 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

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

  1. Объявлены переменные:
    • S (введенная площадь круга)
    • D (диаметр круга)
    • L (длина окружности круга)
    • two (число 2)
    • msgS (приглашение для ввода площади)
    • msgD (формат вывода длины окружности)
    • msgL (формат вывода диаметра круга)
    • tps (формат вывода строки)
    • tpf (формат вывода числа с плавающей точкой)
  2. Загрузка числа Пи в сопроцессор.
  3. Ввод площади круга с помощью функции scanf.
  4. Проверка корректности ввода с помощью оператора cmp.
  5. Загрузка площади круга в сопроцессор.
  6. Деление площади на число Пи с помощью инструкции fdiv.
  7. Извлечение квадратного корня из результата с помощью инструкции fsqrt.
  8. Умножение полученного значения на 2 с помощью инструкции fimul.
  9. Сохранение результата в переменную D с помощью инструкции fst.
  10. Очистка стека для сохранения диаметра круга.
  11. Умножение диаметра на число Пи с помощью инструкции fmul.
  12. Сохранение результата в переменную L с помощью инструкции fst.
  13. Очистка стека для сохранения длины окружности.
  14. Вывод сообщения msgD с помощью функции printf.
  15. Вывод сообщения msgL с помощью функции printf.
  16. Вывод сообщения msgS с помощью функции printf.
  17. Вызов функции fflush для актуализации буферизованного вывода.
  18. Вызов функции _getch для проверки нажатия любой клавиши.
  19. Выход из программы с помощью функции exit.
  20. Альтернативный вариант конца программы (не используется).

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

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