На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Работа с системой команд сопроцессора, доделать программу с использованием вещественных команд сопроцессора
    Помогите, пожалуйста, с заданием: составить и отладить программу на языке ассемблера для вычисления значения функции, используя регистры сопроцессора. Написать программу с использованием вещественных команд сопроцессора. Программу оформить с использованием внутренних процедур
    (каждая «веточка» вычисляется в отдельной процедуре). Программу протестировать по всем условиям.
    В общем у меня там выбивает в регистрах сопроцессора Empty(ну, т.е. они пустые). Как это исправить?
    Вот мой исходный код:
    ExpandedWrap disabled
      ;Антонюк, Вариант №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
    Сообщение отредактировано: Andrey_2019 -
      Andrey_2019, зачем создавать две одинаковые темы?

      Цитата Andrey_2019 @
      В общем у меня там выбивает в регистрах сопроцессора Empty(ну, т.е. они пустые). Как это исправить?
      Где там?
      Что значит "выбивает в регистрах сопроцессора Empty"? Что выбивает?
        Возможно, что речь о просмотре состояния сопроцессора в отладчике td.
        Некоторые версии td содержат ошибку и при любых манипуляциях с сопроцессором показывают значения Empty для регистров.
        Решение проблемы - замена отладчика - поищите пакет tasm другой версии (номер не помню, но или в tasm 3 или в tasm 4 отладчик корректный).

        Jin X, его темы - продолжение одна другой - сначала в целых числах но с вычислениями в FPU, а теперь полностью в FPU.
          Цитата Федосеев Павел @
          Возможно, что речь о просмотре состояния сопроцессора в отладчике td.
          Как говорит Аркадий Паровозов: "Всё возможно, всё бывает, так сказать" :)
          Но если ТС напишет сам, в чём конкретно у него загвоздка, то и гадать не придётся.
          А так да, в некоторых версиях TD с FPU проблемы. По крайней мере, под DOSBox.
          Можно попробовать версию 3.2, там должно быть всё (или почти всё) нормально.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0254 ]   [ 16 queries used ]   [ Generated: 25.06.21, 08:52 GMT ]