Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.200.226] |
|
Сообщ.
#1
,
|
|
|
Помогите, пожалуйста, с заданием: составить и отладить программу на языке ассемблера для вычисления значения функции, используя регистры сопроцессора. Написать программу с использованием вещественных команд сопроцессора. Программу оформить с использованием внутренних процедур
(каждая «веточка» вычисляется в отдельной процедуре). Программу протестировать по всем условиям. В общем у меня там выбивает в регистрах сопроцессора Empty(ну, т.е. они пустые). Как это исправить? Вот мой исходный код: ;Антонюк, Вариант №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 |
Сообщ.
#2
,
|
|
|
Andrey_2019, зачем создавать две одинаковые темы?
Цитата Andrey_2019 @ Где там?В общем у меня там выбивает в регистрах сопроцессора Empty(ну, т.е. они пустые). Как это исправить? Что значит "выбивает в регистрах сопроцессора Empty"? Что выбивает? |
Сообщ.
#3
,
|
|
|
Возможно, что речь о просмотре состояния сопроцессора в отладчике td.
Некоторые версии td содержат ошибку и при любых манипуляциях с сопроцессором показывают значения Empty для регистров. Решение проблемы - замена отладчика - поищите пакет tasm другой версии (номер не помню, но или в tasm 3 или в tasm 4 отладчик корректный). Jin X, его темы - продолжение одна другой - сначала в целых числах но с вычислениями в FPU, а теперь полностью в FPU. |
Сообщ.
#4
,
|
|
|
Цитата Федосеев Павел @ Как говорит Аркадий Паровозов: "Всё возможно, всё бывает, так сказать" Возможно, что речь о просмотре состояния сопроцессора в отладчике td. Но если ТС напишет сам, в чём конкретно у него загвоздка, то и гадать не придётся. А так да, в некоторых версиях TD с FPU проблемы. По крайней мере, под DOSBox. Можно попробовать версию 3.2, там должно быть всё (или почти всё) нормально. |