Консультация № 178552
21.05.2010, 18:10
42.84 руб.
0 1 1
Уважаемые эксперты! Требуется написать программу(с комментариями) Даны три стороны треугольника. Найти радиус описанной окружности. Операции с плавающей точкой в архитектуре x86
Платформа DOS, ассемблер TASM.

Обсуждение

давно
Посетитель
7438
7205
22.05.2010, 10:23
общий
это ответ
Здравствуйте, Филимонов Алексей Викторович.
Вот Вам программа, решающая задачу.
Ввод-вывод отсутствует, т.к. это программа чисто на демонстрацию работы с сопроцессором.
Код:

.model tiny, C
.data
a dd 2.4 ;три стороны
b dd 3.6
c dd 4.1
R dd 0 ;здесь будет радиус описанной окружности
c4 dw 4 ;необходимые константы
c2 dw 2

.code
.286
.startup
call CalcR, offset a, offset b, offset c, offset R

mov ax, 4c00h
int 21h

;вычисление радиуса описанной окружности
;параметры: адреса длин трех сторон и адрес радиуса
;все величины формата float = dword
;используем формулу: R=abc/4S, где S - площадь треугольника
;Площадь ищем по формуле S=sqrt(p(p-a)(p-b)(p-c)), где p=(a+b+c)/2
CalcR proc pa:word, pb:word, pc:word, pr:word
uses di, si, bx
mov di,pa
fld dword ptr [di] ;a
mov si,pb
fmul dword ptr [si] ;a*b
mov bx,pc
fmul dword ptr [bx] ;a*b*c

;ищем p
fld dword ptr [di] ;a
fadd dword ptr [si] ;a+b
fadd dword ptr [bx] ;a+b+c
fidiv c2 ;p=(a+b+c)/2

fld st ;st=st(1)=p
fsub dword ptr [di] ;p-a
fld st(1) ;st=p
fsub dword ptr [si] ;p-b
fld st(2) ;st=p
fsub dword ptr [bx] ;p-c
fmulp ;(p-c)(p-b)
fmulp ;(p-c)(p-b)(p-a)
fmulp ;(p-c)(p-b)(p-a)p
fsqrt ;S=sqrt((p-c)(p-b)(p-a)p)
fimul c4 ;4S
fdivp ;a*b*c/4S
mov di, pr
fstp dword ptr [di] ;сохраним результат
ret
CalcR endp

end
4
Спасибо) очень признателен
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа