На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania 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-битные).
В-третьих, не очень понятно что вы хотите получить и в каком формате хранятся эти данные.
В-четвёртых, сто за ассемблер?
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Цитата 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 @
Это урезанный вариант следующего кода
Если не заниматься анализом... что он должен делать?
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Походу тут выполняется попытка целочисленными инструкциями работать с форматами плавающей точки
Одни с годами умнеют, другие становятся старше.
А в чём смысл? Неужели быстрее будет?
p.s. Есть SSE, если что ;). Причём, найти процессор, который не поддерживает SSE2 – это нужно ещё постараться. Как минимум он должен не поддерживать режим x64, а такие уже раритет.
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Та дело даже не в этом. Обрати внимание на комменты к инструкциям 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 в соответствующей степени.
Одни с годами умнеют, другие становятся старше.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1223 ]   [ 19 queries used ]   [ Generated: 21.11.18, 14:20 GMT ]