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

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

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

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> сопроцессор , вещественная арифметика
    ;Имеем 2 дробных числа с фиксированной "запятой"
    ExpandedWrap disabled
      ;dig1 dd 0,0
      ;dig2 dd 0,0
      ;res  qd 0,0,0,0    - итог арифметической операции
      ;buf  db 10 dup (0) - набранное на дисплее число

    В соответствии с источником, арифметическую операцию (например - сложения) можно провести с помощью
    команд сопроцессора:
    ExpandedWrap disabled
      ...
      ;копируем каждое число с дисплея в переменную:
      push eax
      movzx eax,buf
      mov  dig,eax
      pop  eax
      ...
      ;складываем числа:
      finit
      fld  dig1
      fld  dig2
      fadd
      fstp res
      ...
      push  offset buf
      push  [hedt]
      call  SetWindowTextA@8                            
      ret
      ...

    Подскажите, как можно передать число из "res" в "buf", для вывода на дисплей?
    :scratch:
      Для значений с фиксированной запятой FPU не нужен.
        Цитата cupoma58 @
        В соответствии с источником, арифметическую операцию (например - сложения) можно провести с помощью
        команд сопроцессора

        С каким источником?
        Фиксированную точку для того и придумали, что над числами с фиксированной точкой работают целочисленные команды.
        Как Qraizer уже ответил - FPU не нужен. FLD загрузит в FPU не то что ты ожидаешь.
          Обычные целые числа – это числа без запятых (даже фиксированных). Для них используются обычные mov, add, sub и пр.
          Если говорить о фиксированных, то тут есть варианты. В зависимости от операции и от того, как эта точка представлена.
          К примеру.
          4 байта, 2 старших байта - целая часть, 2 младших - дробная.
          Складываем просто:
          ExpandedWrap disabled
            mov eax,X
            add eax,Y  ; результат в eax
          Вычитаем так же.
          А вот с умножением будет уже чуть позамороченнее:
          ExpandedWrap disabled
            mov eax,X
            imul Y  ; или mul Y для беззнакового умножения, результат в edx:eax
            shrd eax,edx,16  ; 2 младших байта eax нам не нужны, а 2 старших байта edx будут утеряны, если результат превысит допустимые границы

          Для упрощения можно использовать FPU, но тогда нужно будет умножать и делить числа и результат на 65536, например.
          Умножение:
          ExpandedWrap disabled
            push X
            push Y
            push dword ptr 65536
            fild dword ptr [esp+8]  ; X
            fdiv dword ptr [esp]    ; /65536
            fild dword ptr [esp+4]  ; Y
            fdiv dword ptr [esp]    ; /65536
            fmulp
            fmul dword ptr [esp]    ; *65536
            fistp Result
            add esp,12
          Ну или так:
          ExpandedWrap disabled
            push X
            push Y
            push dword ptr 65536
            fild dword ptr [esp+8]  ; X
            fmul dword ptr [esp+4]  ; Y
            fdiv dword ptr [esp]    ; /65536
            fistp Result
            add esp,12
            Цитата Jin X @
            Обычные целые числа – это числа без запятых (даже фиксированных). Для них используются обычные mov, add, sub и пр.
            Если говорить о фиксированных, то тут есть варианты. В зависимости от операции и от того, как эта точка представлена.
            К примеру.
            4 байта, 2 старших байта - целая часть, 2 младших - дробная.
            Складываем просто:
            ExpandedWrap disabled
              mov eax,X
              add eax,Y  ; результат в eax
            Вычитаем так же.
            А вот с умножением будет уже чуть позамороченнее:
            ExpandedWrap disabled
              mov eax,X
              imul Y  ; или mul Y для беззнакового умножения, результат в edx:eax
              shrd eax,edx,16  ; 2 младших байта eax нам не нужны, а 2 старших байта edx будут утеряны, если результат превысит допустимые границы

            Для упрощения можно использовать FPU, но тогда нужно будет умножать и делить числа и результат на 65536, например.
            Умножение:
            ExpandedWrap disabled
              push X
              push Y
              push dword ptr 65536
              fild dword ptr [esp+8]  ; X
              fdiv dword ptr [esp]    ; /65536
              fild dword ptr [esp+4]  ; Y
              fdiv dword ptr [esp]    ; /65536
              fmulp
              fmul dword ptr [esp]    ; *65536
              fistp Result
              add esp,12
            Ну или так:
            ExpandedWrap disabled
              push X
              push Y
              push dword ptr 65536
              fild dword ptr [esp+8]  ; X
              fmul dword ptr [esp+4]  ; Y
              fdiv dword ptr [esp]    ; /65536
              fistp Result
              add esp,12

            Тема закрыта, благодарю.
            :yes:
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0279 ]   [ 16 queries used ]   [ Generated: 28.03.24, 17:51 GMT ]