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

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

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

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> вещественная арифметика , конвертация
    ExpandedWrap disabled
      ...
      ;cel_leng  dd ? - длина целой части
      ;cel       dd ? - целая часть числа (bin)
      ;drob      dd ? - дробная часть числа (bin)
      ;chislo    dd ? - число
      ...
      itog:
        xor  eax,eax              ;очищаем
        lea  eax,chislo           ;1-й байт chislo
        mov  ebx,cel              ;добавляем    
        mov  [eax],ebx            ;целую часть
        lea  eax,сhislo-1         ;адрес       <- что-то тут  
        add  eax,cel_len          ;точки       <- не так, а что?
        mov  byte ptr [eax],"."   ;добавляем точку
        inc  eax                  ;смещаемся вправо
        mov  ebx,drob             ;добавляем  
        mov  [eax],ebx            ;дробную часть
      ...

    Подскажите - почему не работает и куда смотреть? :(
      Очень странный код. Не так там, по-моему всё, а не только 2 выделенные строки.
      Во-первых, идея всунуть символьную точку в двоичное число – полнейший абсурд.
      Во-вторых, смешана работа с байтами и двойными словами (регистры же 32-битные).
      В-третьих, не очень понятно что вы хотите получить и в каком формате хранятся эти данные.
      В-четвёртых, сто за ассемблер?
        Цитата Jin X @
        В-третьих, не очень понятно что вы хотите получить и в каком формате хранятся эти данные.
        В-четвёртых, сто за ассемблер?

        Это masm32v11.
        Это урезанный вариант следующего кода:
        ExpandedWrap disabled
          ...
          asc2float proc
            pushad
            lea  esi,stroka-1    ;правый байт  
            add  esi,sfull       ;целой части
            mov  ecx,sfull       ;счётчик
            mov  bufer,0         ;инициируем... (bufer dd ?)
            mov  bfull,0         ;bfull dd ?
            mov  bdrob,0         ;bdrob dd ?
            xor  eax,eax         ;очищаем
          f1:                    ;преобразуем целую часть:
            mov  al,[esi]        ;берём байт
            or   al,al           ;есть что?
            jz   d1              ;нет->d1
            and  al,0Fh          ;да->убираем 3-ку
            mul  mult            ;учитываем coмножитель (mult dd 1.0)
            add  bfull,eax       ;сохраняем  
            mov  eax,mult        ;обновляем
            mul  ten             ;множитель и (ten dd 10.0)
            mov  mult,eax        ;сохраняем его
            dec  esi             ;смещаемся влево
            loop f1              ;повторяем
          d1:                    ;преобразуем дробную часть:
            lea  esi,stroka+1    ;левый байт  
            add  esi,sfull       ;дробной части
            mov  ecx,sdrob       ;счётчик
            xor  eax,eax         ;очищаем
          d2:                  
            mov  al,[esi]        ;берём байт
            or   al,al           ;есть что?
            jz   itog            ;нет->itog
            and  al,0Fh          ;да->убираем 3-ку
            mul  aten            ;учитываем множитель (aten dd 0.1)
            add  bdrob,eax       ;сохраняем  
            mov  eax,aten        ;обновляем
            mul  aten            ;множитель и
            mov  aten,eax        ;сохраняем его
            inc  esi             ;смещаемся вправо
            loop d2              ;повторяем
          itog:                  ;здесь я не совсем уверен:
            xor  edi,edi         ;очищаем
            lea  edi,bufer       ;адрес начала bufer
            mov  ebx,bfull       ;добавляем    
            mov  [edi],ebx       ;целую часть
            lea  edi,bufer-1     ;адрес  
            add  edi,sfull       ;точки
            mov  byte ptr [edi],"." ;добавляем точку
            inc  edi             ;смещаемся вправо
            mov  ebx,bdrob       ;добавляем  
            mov  [edi],ebx       ;дробную часть
          fin:
            popad
            ret
          asc2float endp
          ...

        Я сильно сомневаюсь в процедуре "itog"
          Цитата cupoma58 @
          Это урезанный вариант следующего кода
          Если не заниматься анализом... что он должен делать?
            Походу тут выполняется попытка целочисленными инструкциями работать с форматами плавающей точки
              А в чём смысл? Неужели быстрее будет?
              p.s. Есть SSE, если что ;). Причём, найти процессор, который не поддерживает SSE2 – это нужно ещё постараться. Как минимум он должен не поддерживать режим x64, а такие уже раритет.
                Та дело даже не в этом. Обрати внимание на комменты к инструкциям mul. Типа (... dd 0.1). Походу он пытается mulить с eax 32-битный float.
                  Цитата Jin X @
                  А в чём смысл?
                  Например:
                  1. Истиное равномерное распределение представляемых вещественных чисел;
                  2. Абсолютно точное хранение чисел вида: 0,3 или 1,7 (и т.д.)
                    Цитата Qraizer @
                    Та дело даже не в этом. Обрати внимание на комменты к инструкциям mul. Типа (... dd 0.1). Походу он пытается mulить с eax 32-битный float.

                    Этот код - попытка преобразования символьного дробного числа в двоичное:
                    ExpandedWrap disabled
                      12.34 ->31322E3334 -> 1 22E 3 4 -> целая часть справа-налево, дробная слева-направо

                    с целью его дальнейшего использования:
                    ExpandedWrap disabled
                      fld  dig1
                      fld  dig2
                      ;арифм.операция
                      fst  itog

                    именно выделенные строчки вызывают у меня сомнение и я ожидаю подсказки - в каком направлении работать?
                      Ну, я так и подумал. Только всё равно нихрена не очевидно было. Тогда тебе проще преобразовать ASCII-символы в цифры, скомпоновать в BCD и просто грузануть FBLD. А положение десятичной запятой учесть уже в готовом вещественном, просто поделя на 10 в соответствующей степени.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,1725 ]   [ 16 queries used ]   [ Generated: 29.03.24, 00:41 GMT ]