Fsin и fcos почему-то не работают с моим процессором
для нахождения значения выражения мне нужно использовать косинус и синус. Я пытаюсь их задать через fsin и fcos, но выходит ошибка, типа эти функции не поддерживаются моим процессором. Вопрос в том, где я ошибся при использовании сопроцессора и этих функций. Можно ли это как-то исправить или нужно задавать косинус и синус другим способом, через иррациональную e, например. Работаю в турбо ассемблере и asm visual, файл создаю 32битный (masm)
.8087
.model small
.stack 100h
DATA_SEG SEGMENT
two dd 2.0 ; Константа 2.0
three dd 3.0 ; Константа 3.0
x dd 0.0 ; Начальное значение x
y dd ? ; Переменная для хранения результата y
b dd 0.1 ; Шаг изменения x
sinh dd ? ; Переменная для хранения 2 * sin(x)
cosh dd ? ; Переменная для хранения 3 * cos(x^2)
DATA_SEG ENDS
STAC SEGMENT PARA STACK
DB 128 DUP(?) ; Область памяти под стек
STAC ENDS
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG, DS:DATA_SEG, SS:STAC
START:
MOV AX, DATA_SEG ; Инициализация сегмента данных
MOV DS, AX
FINIT ; Инициализация FPU
MOV CX, 15 ; Установить количество итераций цикла
OTR:
; Вычисление 2 * sin(x)
FLD x ; Загрузить x в FPU
FSIN ; Вычислить sin(x)
FLD two ; Загрузить 2.0
FMUL ; Умножить 2 * sin(x)
FST sinh ; Сохранить результат в sinh
; Вычисление 3 * cos(x^2)
FLD x ; Загрузить x
FMUL ST(0), ST(0) ; Вычислить x^2
FCOS ; Вычислить cos(x^2)
FLD three ; Загрузить 3.0
FMUL ; Умножить 3 * cos(x^2)
FST cosh ; Сохранить результат в cosh
; Вычисление y = sinh — cosh
FLD sinh ; Загрузить sinh
FLD cosh ; Загрузить cosh
FSUB ; sinh — cosh
FST y ; Сохранить результат в y
; Увеличение x на шаг b
FLD x ; Загрузить x
FLD b ; Загрузить b
FADD ; x + b
FST x ; Сохранить новое значение x
LOOP OTR ; Повторить цикл
; Завершение программы
MOV AH, 4CH ; Функция DOS для завершения программы
MOV AL, 0 ; Код возврата 0
INT 21H ; Вызов DOS-прерывания
CODE_SEG ENDS
END START