.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
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.