;Программа вычисляет значения функции F(x) в интервале [-10,12]
;при изменении переменной x шагом 2
;F(x) = a(x^2 + y^2 ) - b/(x^2 - y^2 ),
;где a = -2.5; b = 0.563; y=4
.model tiny, C
.286
.code
.startup
lea di, fx
mov bx, -10
calc_loop:
cmp bx, 12
jg finish
call f, bx
fstp dword ptr [di]
add di, 4
add bx, 2
jmp calc_loop
finish:
mov ax, 4c00h
int 21h
;функция принимает целый параметр Х в стеке
;возвращает в st результат
;в случае деления на 0 возвращает 0 и FC=1
;иначе FC=0
f proc x:word
fild x ;x
fmul st, st(0) ;x^2
fld y ;y,x^2
fmul st, st(0) ;y^2,x^2
fld st ;y^2,y^2,x^2
fadd st(0),st(2) ;y^2+x^2,y^2,x^2
fmul a ;a(y^2+x^2),y^2,x^2
fxch st(2) ;x^2,y^2,a(y^2+x^2)
fsubrp ;x^2-y^2,a(y^2+x^2)
fldz ;загрузим 0
fcomp st(1) ;сравним с 0 (с удалением 0)
fstsw ax ;флаги в ax
sahf ;флаги в регистров флагов
jz ZeroDevide ;=0 -> делить не будем!
fdivr b ;b/(x^2-y^2),a(y^2+x^2)
fsubr ;a(y^2+x^2)-b/(x^2-y^2)
clc
ret
ZeroDevide:
fstp st(1) ;уберем из стека st(1) и вернем 0
stc
ret
f endp
.data
a dd -2.5
b dd 0.563
y dd 4.
.data?
fx dd 12 dup (?)
end
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.