На главную
ПРАВИЛА 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-битные).
      В-третьих, не очень понятно что вы хотите получить и в каком формате хранятся эти данные.
      В-четвёртых, сто за ассемблер?
      aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
        Цитата 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 @
          Это урезанный вариант следующего кода
          Если не заниматься анализом... что он должен делать?
          aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
            Походу тут выполняется попытка целочисленными инструкциями работать с форматами плавающей точки
            Одни с годами умнеют, другие становятся старше.
              А в чём смысл? Неужели быстрее будет?
              p.s. Есть SSE, если что ;). Причём, найти процессор, который не поддерживает SSE2 – это нужно ещё постараться. Как минимум он должен не поддерживать режим x64, а такие уже раритет.
              aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
                Та дело даже не в этом. Обрати внимание на комменты к инструкциям 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,1127 ]   [ 16 queries used ]   [ Generated: 19.09.20, 09:12 GMT ]