СПРОСИ ПРОФИ
👍
0
👎 01

Ассемблер, сопроцессор

Здравствуйте, для нахождения значения выражения мне нужно использовать косинус и синус. Я пытаюсь их задать через fpsin и fpcos, но выходит ошибка, где сказано, что эти функции illegal и т.п.. Если я использую 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
FPSIN ; Вычислить 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
FPCOS ; Вычислить 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

программисты IT     #1   07 янв 2025 04:17   Увидели: 45 клиентов, 2 специалиста   Ответить
👍
0
👎 0

Так и есть, в сопроцессоре .8087 отсутствуют инструкции fsin и fcos.
А fpsin разве существует? где нашли про него информацию?
Либо используйте директиву другого процессора, в котором они есть, либо вычисляйте косвенно через fptan.
https://sysprog.ru/post/direktivy-assemblera

Задайте свой вопрос программистам –
профессионалам

Сейчас онлайн 75 программистов
Получите ответ профи быстро и бесплатно
ASK.PROFI.RU © 2020-2026