Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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.
Как говорит Аркадий Паровозов: "Всё возможно, всё бывает, так сказать" :)
Но если ТС напишет сам, в чём конкретно у него загвоздка, то и гадать не придётся.
А так да, в некоторых версиях TD с FPU проблемы. По крайней мере, под DOSBox.
Можно попробовать версию 3.2, там должно быть всё (или почти всё) нормально.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)