Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Assembler > Работа с системой команд сопроцессора |
Автор: Andrey_2019 27.06.20, 07:19 |
Помогите, пожалуйста, с заданием: составить и отладить программу на языке ассемблера для вычисления значения функции, используя регистры сопроцессора. Написать программу с использованием вещественных команд сопроцессора. Программу оформить с использованием внутренних процедур (каждая «веточка» вычисляется в отдельной процедуре). Программу протестировать по всем условиям. В общем у меня там выбивает в регистрах сопроцессора Empty(ну, т.е. они пустые). Как это исправить? Вот мой исходный код: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ;Антонюк, Вариант №2 masm model use16 small .486 .stack 100h .data ;сегмент данных a dd 5.0 b dd 6.0 y dd ? rez dd ? one dd 1.0 mone dd -1.0 ten dd 10.0 two dd 2.0 three dd 3.0 four dd 4.0 five dd 5.0 six dd 6.0 .code main proc mov ax,@data mov ds,ax finit ;приведение сопроцессора в начальное состояние fld a ;загрузка значение a в st(0) fadd b ;st(0)=a+b fcomp ten ;сравниваем st(0) c 9 и одновременно сбрасываем регистр st(0) fstsw ax ;сохранение swr в регистре ax sahf ;запись swr->ax-> регистр флагов jnc met1 ;если a+b>10 переход на метку1 fld a ;аналогичная проверка для -2 fadd b fcomp mone fstsw ax sahf jc met2 ;если ab<-2 переход на метку2 call p3 ;вычисляем значение при -2 <= ab <= 10 jmp exit met1: call p1 ;вычисляем значение при ab > 10 jmp exit met2: call p2 ;вычисляем значение при ab < -2 exit: mov ax,4c00h int 21h main endp p1 proc ;вычисляем значение при a+b>10 : 4ab + 5 fld a ;st(0)=a fmul b ;st(0)=a*b fmul four ;st(0) = 4ab fst y ; bx = 4ab fadd five fst y ret p1 endp p2 proc ;вычисляем значение при ab < -2 : 3ab + 2b / a^2 + b^2 + 1 ;Знаменатель fld a ;st(0)=a fmul a ;st(0)=aa fst y ; bx = aa fld b ; st = b fmul b ; st = bb fst rez ; rez = bb fld y fadd rez ; st = aa + bb fadd one ; st = aa + bb + 1 fst y ;Числитель fld a fmul b fadd three fadd b fadd b fdiv y; деление fst y ret p2 endp p3 proc ;вычисляем значение при -2 <= a+b <= 10 : 6a - 2b^2 + 1 fld a ;st(0)=a fmul six fst y fld b fmul b fmul two fst rez fld y fsub rez fadd one fst y ret p3 endp end main Условие по процедурам, в нём вычисляется значение y: 4xy+5,x+y>10 (3xy+2y)/(x^2+y^2+1),x+y< -2 6x-2y^2+1,-2≤x+y≤1 |
Автор: Jin X 27.06.20, 11:08 |
Andrey_2019, зачем создавать две одинаковые темы? Цитата Andrey_2019 @ Где там?В общем у меня там выбивает в регистрах сопроцессора Empty(ну, т.е. они пустые). Как это исправить? Что значит "выбивает в регистрах сопроцессора Empty"? Что выбивает? |
Автор: Федосеев Павел 27.06.20, 18:30 |
Возможно, что речь о просмотре состояния сопроцессора в отладчике td. Некоторые версии td содержат ошибку и при любых манипуляциях с сопроцессором показывают значения Empty для регистров. Решение проблемы - замена отладчика - поищите пакет tasm другой версии (номер не помню, но или в tasm 3 или в tasm 4 отладчик корректный). Jin X, его темы - продолжение одна другой - сначала в целых числах но с вычислениями в FPU, а теперь полностью в FPU. |
Автор: Jin X 27.06.20, 18:37 |
Как говорит Аркадий Паровозов: "Всё возможно, всё бывает, так сказать" Но если ТС напишет сам, в чём конкретно у него загвоздка, то и гадать не придётся. А так да, в некоторых версиях TD с FPU проблемы. По крайней мере, под DOSBox. Можно попробовать версию 3.2, там должно быть всё (или почти всё) нормально. |